Java排序之快速排序

前言

快速排序作为排序算法的王者,我们没有理由不掌握它

引用自大话数据结构.png
  • 快速排序的基本思想:
    通过一趟排序将待排序记录分割成独立的两部,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的.

  • 快速排序的快速理解:
    把数据分成左右两部分,左边的所有数据都比右边数据小, 再把左右两部分的数据按同样的方法排序. 很明显快速排序是不稳定的,排序的结果次序可能不一致.

举例分析

int s[] = {52,78,12,99,5,18,80,32,66};

快速排序示意图.png

画了一张很简单的图, 力求简单.每个格子想象成一个待挖的坑.

第一步: 我们先随便从数组中拿一个数据作为基准数p.便于演示,就用s[0] 吧,即p=s[0] . 注意,我们在s[0]处拿了一个数据,我们就想象从数组s中挖了一个坑,而且这个坑的位置就是s[0],下面我们来看看如何填坑

第二步:找 s[k] < p :从索引K的结尾处开始向前找. 找比s[0] (即p)小的数.如图中的绿色箭头方向,标号①表示绿色查找优先红色查找,很明显s[7]=32 < s[0]=52 , 此时我们把32挖出来去填s[0]的坑, 让s[0]=s[7] , 所以此时s[0]为32,就是说我们把第一个坑填了. 但是有一个新坑k[7],此时的数据顺序:
32,78,12,99,5,18,80,32,66

第三步:找 s[i] > p :从索引 i 的开始处从前向后找.找比s[0] (即p)大的数.如图中的红色箭头方向.我们看到 s[1] = 78 > p=52 .所以我们挖出s[1]的数据放到上一步的坑中,就是k[7]了.此时我们的新坑i[1] , 让 s[7]=s[1],此时的数据顺序:
32,78,12,99,5,18,80,78,66

我们在第二步中得到了K=7,在第三步中得到了i=1.那么在下一轮的查找中k从6开始,然后i从2开始.这样重复执行第二步然后第三步,直到 i = k . 这样就完成了左边的数据都是小于右边的数.之后用同样的方法从第一步开始分别对左右部分的数据进行排序,得到的就是最终的结果

Java代码示例

原理讲完了,我们来撸一下java的实现.

public void quickSort(int arr[],int sIndex,int eIndex){
        if (sIndex < eIndex) {
            int p = arr[sIndex] , i = sIndex , k = eIndex;
            while (i < k) {
                while(i < k && arr[k] >= p) // 从右向左找
                    k--;

                if (i < k ) arr[i++] = arr[k];

                while(i < k && arr[i] < p) // 从左向右找
                    i++;

                if (i < k ) arr[k--] = arr[i];
            }
            arr[i] = p;
            quickSort(arr, sIndex, i - 1); // 递归
            quickSort(arr, i + 1, eIndex);
        }
}

结束

快速排序还有很多优化版本,但是基本思想都是类似的,很大程度上取决P的选择,比如如果P处于数列的中间,那么就趋于平衡树,效率会提高.总的来说,快速排序名副其实,我们应该好好学习它.谢谢大家!

参考文章
白话经典算法系列之六 快速排序 快速搞定

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 9,214评论 0 2
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 11,555评论 1 42
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 5,051评论 0 2
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 6,261评论 0 2
  • 188期学员 姓名:孙燕茹 公司:北京旺顺阁餐饮管理有限公司 【日精进打卡第5天】 【知~学习】 《六...
    阿茹姐阅读 2,642评论 0 1

友情链接更多精彩内容