算法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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值