【算法-排序之二】快速排序
2016-03-09 00:00
330 查看
算法-排序之快速排序
快速排序得名于实际应用的高效率,它几乎是最快的排序算法,入选20世纪十大算法之列。快速排序体现了计算机设计的“分治法”思想,核心是将整个问题分割成多块相对容易处理的小问题,分而治之。利用分治法原理的排序算法,还有希尔排序算法等等。1.快速排序QuickSort
核心:如果你知道多少人该站你前面,多少人站你后面,你一定知道你该站哪个位置。
快速排序是做到着一定的步骤分为:
1.选取分界数,参考这个分界数,大于参考数放在右边,小于的放在左边。
2.对左右两边的序列分别递归进行1处理
3.将整个序列合并得到有序结果
相比冒泡排序【算法-排序之一】冒泡排序”冒泡“的形象,快速排序似乎就不那么贴切了。分析上述步骤,该算法每次分区,实际上确定了所选分界数的位置。
![](http://static.oschina.net/uploads/img/201603/09124933_0u32.jpg)
选中分界数:8 然后将序列分割
![](http://static.oschina.net/uploads/img/201603/09124933_Rwi0.jpg)
比8小的数 比8大的数
根据左右两个框内的数字个数,可以知道分界数8应该摆放的位置。快速排序的实现方式有很多,下面给出一种实现:
![](http://static.oschina.net/uploads/img/201603/09124933_gGCJ.jpg)
![](http://static.oschina.net/uploads/img/201603/09124934_5yHY.jpg)
快速排序是众多排序算法中较复杂的一种,只要认真抓住算法的核心,理解快速排序还是不难的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | //分区函数Part() //start,end分别为数据起始与结束位 int Part ( int Array [], int left , int right ){ int temp = Array [ left ]; //选择最第一个数据为分界数,并保存 while ( left < right ) { while ( left < right && Array [ right ] > temp ){ right -- ; } Array [ left ] = Array [ right ]; //找到比分界数小的数,放到数组的左边 //此时,right右边的数均比分界数大 while ( left < right && Array [ left ] <= temp ){ left ++ ; } Array [ right ] = Array [ left ]; //找到比分界数大的数,放到right位置 //此时left左边的数均比分界数小 } //当left与right相等时,便找到了分界数的位置 Array [ left ] = temp ; return left ; } //快排QuickSort() void QuickSort ( int Array [], int left , int right ){ if ( left < right ) //控制分区是否结束 { int p = Part ( Array , left , right ); QuickSort ( Array , left , p - 1 ); //左边递归 QuickSort ( Array , p + 1 , right ); //右边递归 } } |
QuickSort.c
2.时间复杂度
分析快速排序的时间复杂度比较困难,通过递归方法,可以初略地看到结果:
数据个数n=1是,F=0
F(n)=n-1+2F(n/2) //分成两个大小为n/2的快
=n-1+2(n/2-1)
....
=O(nlogn)
这个时间复杂度优于冒泡排序【算法-排序之一】冒泡排序。
3. 空间复杂度
快速排序的空间消耗主要来源于递归调用时产生的栈消耗,其复杂度介于O(logn)与O(n)之间。
相关文章推荐
- 使用 Emmet 生成 HTML 的语法详解
- nginx 反向代理 端口设置问题
- php empty()和isset()的区别
- 书写高质量的jQuery代码
- 45个超实用的JavaScript技巧及最佳实践(一)
- Ubuntu下使用SVN
- ini_set的用法
- linux下svn开机自动启动
- py2exe error: MSVCP90.dll: No such file or directory
- CSS HACK区别IE6、IE7、IE8、Firefox兼容性
- ECMALL数据库关系模型的实现
- 如何取消CentOS 的图形界面直接进入命令行模式
- git如何忽略文件或者文件夹
- Linux下常用SVN命令
- ThinkPHP中SQL调试方法
- 详解mysql int类型的长度值问题
- Ubuntu Linux下设置IP的配置命令
- fireEvent方法的使用
- MySQL本地可以连接,远程连接不上的解决
- SVN中的check out与export的区别