排序算法(五)——快速排序
来源:互联网 发布:薛之谦男装淘宝店铺 编辑:程序博客网 时间:2024/05/17 23:20
基本思想
快速排序也是基于分治算法得。步骤如下:
(1)选择一个基准元素,通常选择第一个元素或者最后一个元素;
(2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的元素值比基准值大;
(3)此时基准元素在其排好序后的正确位置;
(4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
上图中,演示的是第一轮快速排序的过程,首先将第一个元素选为基准点,从右端第一个元素开始扫描,找到第一个比57小的元素(19)时停止,两者交换位置,然后从左端开始扫描,找到第一个比57大的元素(68)时停止,两者交换位置,周而复始,直到57找不到可交换的元素为止,至此一轮快速排序结束。
这时,比57小的元素都在左边,比57大的元素都在右边,分别对两边的数组段继续进行快速排序,依次类推,最终使整个数组有序。
java实现
算法分析
在归并排序中,我们详细推算了时间复杂度,快速排序与归并排序一样采取了分治算法,它的时间复杂度也是O(N*log2N)。
对于分治算法一般都是如此,用递归的方法把数据项分为两组,然后调用自身来分别处理每一组数据。算法实际上是以2为底,运行时间与N*log2N成正比。
对于快速排序来说,最理想的状态是随机分布的数据,即我们任意选定的枢纽处于中间位置,有一半元素小于它,有一半元素大于它。当数据时由小到大排列或者由大到小排列时,快速排序的效率最低,时间复杂度扩大为O(N2)。
选定第一个元素为枢纽实现起来确实很简单,但是当它为最大值或最小值时,快速排序的效率会严重降低。假如选中的元素为数组的中值,自然是最好的选择,但是却要遍历整个数组来确定中值,这个过程可能比排序花费的时间还长,得不偿失。折衷的方法是找到数组中的第一个、最后一个以及处于中间位置的元素,选出三者的中值作为枢纽,既避免了枢纽是最值的情况,也不会像在全部元素中寻找中值那样费时间。这种方法被称为“三项取中法”(median-of-three)。
- 排序算法(五)——快速排序
- 排序算法之 —— 快速排序(五)
- 排序算法(五)——快速排序
- 排序算法(五) —— 快速排序
- 排序算法(五)——快速排序
- Java排序算法(五):快速排序
- 排序算法(五):快速排序
- Java排序算法(五):快速排序
- 排序算法总结(五)快速排序
- Java排序算法(五):快速排序
- Java排序算法(五):快速排序 .
- Java排序算法(五):快速排序
- 排序算法(五)---- 快速排序
- 排序算法(五)-快速排序
- 算法学习(五)——快速排序
- 排序算法—快速排序
- 排序算法—快速排序
- 五、排序算法之改进算法——希尔排序和快速排序
- 广播
- 单例模式的几种写法
- 利用观察者(Observer)和被观察者(Observable)实现监听操作
- 服务端如何识别已登录用户身份之Session管理和Cookie应用
- $().each() 和$.each 的区别
- 排序算法(五)——快速排序
- Uva 11093 Just Finish it up——思路题
- iOS XML解析笔记
- presentViewController及属性传值
- oracle 修改表字段
- monkeyrunner脚本实践
- hibernate笔记-005-一对一映射
- 排序算法(六)——希尔排序
- java关于equals与==号的区别以及与hashCode的关系