JAVADS——快速排序

  快速排序具体是在序列中选择一个元素(如何选择没有规定),接下来通过"遍历的方式",比较所选定的元素和区间内其他元素的大小关系。
   快排
   1) 如果区间内的元素个数<=1,则不用做任何处理,因为天然有序
   2)从区间中(这里的区间不代表整个数组,所以需要通过[from,to]来限定)中挑选一个pivot,挑选方式随意
   3)遍历区间,将每个元素都和pivot进行比较,并且进行必要的位置移动,是的完成区间遍历之后,整个数组被分成三个小区间,【<= pivot】【pivot】【>=pivot】 整个过程一般称为partition。


   如图所示,所选定的pivot = 7,经过遍历比较之后,就被分成大于7和小于7 的两个区间,此时就变成两个小问题(问题性质一样,都是排序,但是数据规模在明显降低),在两个小区间继续进行上述操作
       
        partition的几种方式(所讨论的区间,很大可能是处于原始数组中间的一段区间,array中的[from,to] from不一定是0,虽然一开始是0,同理。to很大概率也不是array.length - 1,虽然一开始是array.length- 1)
        PartitionA:
        首先确定pivot,然后是 array[left] 与 pivot 进行比较,如果 array[left] < pivot,left就向右走一步,然后下一个值与pivot比较,直到array[left] > pivot,此时比较结束;同理array[right]与pivot比较,array[right] > pivot,array[right]向左走一步,直到array[rigth] < pivot 比较结束。此时交换array[left] 和 array[right],继续重复以上步骤直至 left == right,比较结束,交换 left 和 to,此时第一次partition结束

 PartitionB:

最开始 to ==  right ,array[to] = pivot 然后array[left]与pivot比较,array[left] <= pivot,left向右走,然后 array[right] = array[left];同理 array[right]与pivot比较,array[right] >= pivot,right向左走,接着array[left] = array[right],循环比较直到所有元素完成比较,一次partition完成。

代码如下:

 private static int partitionMethodA(long[] array, int from, int to) {
       
        long pivot = array[to];        
        int left = from;
        int right = to;
    while (left < right) {
           
            while (left < right && array[left] <= pivot) {
                left++;
            }
          
            while (left < right && array[right] >= pivot) {
                right--;
            }
            
            long t = array[left];
            array[left] = array[right];
            array[right] = t;
        }

        long t = array[to];
        array[to] = array[left];
        array[left] = t;

        return left;
    }





    private static int partitionMethodB(long[] array, int from, int to) {
        long pivot = array[to];
        int left = from;
        int right = to;

        while (left < right) {
            while (left < right && array[left] <= pivot) {
                left++;
            }
            array[right] = array[left]; // 这里

            while (left < right && array[right] >= pivot) {
                right--;
            }
            array[left] = array[right]; // 这里
        }

        array[left] = pivot;    // 这里

        return left;
    }


  

  
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值