快速排序
来源:互联网 发布:软件测试教学视频 编辑:程序博客网 时间:2024/06/11 09:16
快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列,快速排序的时间复杂度为O(n*log(n)),最坏的情况是O(n^2),快速排序是不稳定的
复杂度的证明
最优情况
在最优情况下,Partition每次都划分得很均匀,如果排序n个关键字,其递归树的深度就为 [log2n]+1( [x] 表示不大于 x 的最大整数),即仅需递归 log2n 次,需要时间为T(n)的话,第一次Partiation应该是需要对整个数组扫描一遍,做n次比较。然后,获得的枢轴将数组一分为二,那么各自还需要T(n/2)的时间(注意是最好情况,所以平分两半)。于是不断地划分下去,就有了下面的不等式推断:
最坏情况
当待排序的序列为正序或逆序排列时,且每次划分只得到一个比上一次划分少一个记录的子序列,注意另一个为空。如果递归树画出来,它就是一棵斜树。此时需要执行n‐1次递归调用,且第i次划分需要经过n‐i次关键字的比较才能找到第i个记录,也就是枢轴的位置,因此比较次数为 ,最终其时间复杂度为O(n^2)。
c++代码
#include<iostream>using namespace std;int quickSort(int *a, int start, int end) { if(start >= end) return 0; int temp = 0; int key = a[start]; int low = start, high = end; while(low < high) { while(low < high && a[high] >= key) high--; while(low < high && a[low] <= key) low++; if(low != high) { temp = a[low]; a[low] = a[high]; a[high] = temp; } } a[start] = a[high]; a[high] = key; quickSort(a, start, high - 1); quickSort(a, high + 1, end); return 0;}int main() { int a[10] = {1, 3, 2, 5, 8, 5, 4, 4, 0, 3}; quickSort(a, 0, 9); for(int i = 0; i < 10; i++) printf("%d ", a[i]);}
阅读全文
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 并查集详解
- laravel关闭浏览器释放session
- MPI介绍与实践——理论介绍
- XR20M1170IG16TR IIC转RS232调试不通的问题
- 掌贝打印SDK说明
- 快速排序
- 通过机器学习识别恶意url
- PHP AES的加密解密
- aac和mp3在码率压缩的一些事
- struts2重点、精华、用法总结(三):Action相关专题
- 创建博客!
- linux powermanager 之 wakeup
- 研发喜欢和怎样的产品经理干
- 文章标题