快速排序之我的总结

122 阅读2分钟

快速排序

网上的说法

  • 选择第一个数位p,小于p的数放在左边, 大于p的数放在右边
  • 递归的将p左边和右边的数都按照第一步进行,直到不能递归

具体怎么实现的

1 看了公式后,我脑海里浮现的是这么一幅画面,取出第一个数位基准,记录起始和结尾数的下标

2 临时取出起始下标和临时结尾下标,分别与基准数进行对比 ,然后将临时起始数与临时结尾数交换,每交换一轮小标往中心移动 ,知道两者相遇算完成一轮

这样的结果是将基准数大的移到右边,小的移动左边

3 继续从起始点和临时基准点的值也就是左半部分, 继续重复第二部

这样的结果是这次起始点位中心 大的移到右边,小的一道左边

4 右半部分和左半部分一样 进行交换

小结

我理解来的核心思想是,取任意一个数位为基准,将小于这个数的放左边大于的放右边,左半部分(起始值小于临时值)和右半部分(结束值大于临时结束值)还有继续比较分割,一直切到不能分为止,依我看来,每次切割后,开启线程来做排序的事,会更快

为什么说左半部分和左半部分需要继续分呢?

因为例如左半部分的值只能代表比第一轮还小的值,需要再验证一轮左半部分第一个值是否是最小的值

 public static void quickSort(int[]number,int start,int end){
        if(start < end){
            int base = numbers[start];
            int temp;
            int i = start ,j=end;
            do{
                whilte((numbers[i] < base) && (i <end)){
                    i++
                }
                whilte((numbers[i] > base) && (j < end)){
                    j --;
                }
                
                if(i < = i){
                    temp = numbers[i];
                    numbers[i] = numbers[j];
                    numbers[j] = temp;
                    i ++;
                    j--;
                }
            }whilte(i <= j)
            if(start < j){
                quickSort(numbers,start,j);
            }
            if(end > i){
                quickSort(numbers,i)
            }
        }
 }