快速排序——凑活能用版

  1. 快速排序是排序的经典算法,具体思路很简单,但实现起来并非那么容易!

  2. 如果使用最直观的双指针法,总会遇到神奇的问题:low<high 还是 low<=high?!(我纠结一天了真的整不明白orz…)

  3. 所以为了珍爱生命,以后就用挖坑填数法吧。。。

  4. 代码如下:

    import java.util.Arrays;
    public class QuickSort {
        public static void sort(int[] input, int low, int high){
            while(low < high){
                // no need to process low==high since one element is ordered naturally.
                int i = partition(input, low, high);
                if(pivot > k)
                    high = pivot - 1;
                else if(pivot < k)
                    low = pivot + 1;
                else
                    return;
            }
        }
        public static int partition(int[] input, int low, int high){
            int tmp = input[low];
            // now we can write to input[low] directly since tmp save its val;
            while(low<high){
                // loop will be break IMMEDIATELY once low==high;
                while(low<high && input[high]>=tmp)
                    high--;
                if(low<high){
                    input[low] = input[high];
                    low++;
                }
    
                while(low<high && input[low]<=tmp)
                    low++;
                if(low<high){
                    input[high] = input[low];
                    high--;
                }
            }
            // now low==high.
            input[high]=tmp;
            return high;
        }
    
        public static void main(String[] args) {
            int[] a = new int[]{9,8,7,6,5,4,3,2,1};
            sort(a,0,a.length-1);
            System.out.println(Arrays.toString(a));
        }
    }
    
  5. 其中主体函数 sort()用递归实现,而 partition()则用了挖坑填数进行循环排序,实现简单,且最重要的是,边界条件都是一致的 low<high!!!

  6. 当然,此版本是基础版本,可改进的地方有:在排序前先随机打乱一下数组(避免pivot连续踩雷),三数取中选取pivot(尽量令pivot靠近中间),数据量小时使用插排,以及当有重复数据时,使用三分快排。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值