算法05-快排的两种实现方式

使用递归实现快排的两种实现方式:

一、思路1:

  • 把首位元素拎出来。
  • 然后分别从首尾设置指针向中间移动,begin++、end–,首尾指针分别遇到了比首位元素大、比首位元素小的时候停下,交换该位置的元素。
  • 交换完之后继续往中间移动,直到首尾相遇,也就是begin不小于end时,此时begin的位置即为首元素应该所在的位置。
  • 然后从该元素的位置分别往前、往后递归。
  • 代码如下:
    public void quickSort(int[] arr,int begin,int end){
        if (begin>=end){
            return;
        }
        int mid = mid(arr,begin,end);
        quickSort(arr,begin,mid-1);
        quickSort(arr,mid+1,end);
    }
    private int mid(int[]arr ,int begin,int end){
        int _begin=begin;
        int t=0;
        while (begin<end){
            while (begin<end&&arr[begin]<arr[_begin]) begin++;
            while (begin<end&&arr[_begin]<arr[end]) end--;
            if (begin<end){
                t=arr[begin];
                arr[begin]=arr[end];
                arr[end]=t;
            }
        }
        if (_begin!=begin){
            t=arr[begin];
            arr[begin]=arr[_begin];
            arr[_begin]=t;
        }
        return begin;
    }

二、思路2:

  • 数组索引的中间值作为中轴,然后分别从首尾设置指针向中间移动,begin++、end–。
  • 首尾指针分别遇到了比中间值大、比中间值小的时候停下,交换该位置的元素。
  • 当指针所在位置的值等于中间值时,可以不参与比较,指针继续往中间移动,直到首位相遇。
  • 此时如果begin>=end,则代表此时中间值已经被放在了排序后的位置。
  • 如果begin==end,则begin++、end–,此时begin的右边和end的左边,分别成为第二层递归的区域
  • 代码如下:
    public static void quickSort2(int _begin, int _end, int... array) {
        int t=0;
        int begin = _begin;
        int end = _end;
        int mid = array[(_begin + _end) / 2];
        while (begin < end) {
            while (array[begin] < mid) begin++;
            while (array[end] > mid) end--;
            if (begin >= end) break;
            t = array[begin];
            array[begin] = array[end];
            array[end] = t;
            if (array[begin]==mid){
                end--;
            }
            if (array[end]==mid){
                begin++;
            }
        }
        if (begin==end){
            begin++;
            end--;
        }
        if (_begin < end) {
            quickSort2(_begin, end, array);
        }
        if (_end > begin) {
            quickSort2(begin, _end, array);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
快速排序是一种常用的排序算法,其实现思路有多种方式,以下是其中两种常见的实现思路: 1. 基准元素划分法(Lomuto partition scheme): - 选择一个基准元素,一般是待排序数组的最后一个元素。 - 设置两个指针i和j,分别指向待排序数组的起始位置和结束位置。 - 从左到右遍历数组,将小于等于基准元素的元素交换到i的位置,并将i右移一位。 - 最后将基准元素交换到i的位置,这样基准元素左边的元素都小于等于它,右边的元素都大于它。 - 对基准元素左边和右边的两个子数组分别递归进行快速排序。 2. 枢轴元素划分法(Hoare partition scheme): - 选择一个基准元素,一般是待排序数组的第一个元素。 - 设置两个指针i和j,分别指向待排序数组的起始位置和结束位置。 - 从左到右找到一个大于基准元素的元素,从右到左找到一个小于基准元素的元素,然后交换它们的位置。 - 重复上述步骤,直到i和j相遇。 - 将基准元素与相遇位置的元素交换位置,这样基准元素左边的元素都小于等于它,右边的元素都大于它。 - 对基准元素左边和右边的两个子数组分别递归进行快速排序。 无论使用哪种实现思路,快速排序的时间复杂度平均为O(nlogn),最坏情况下为O(n^2),空间复杂度为O(logn)。快速排序是一种原地排序算法,不需要额外的辅助空间。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值