快速排序8
2016-05-21 16:52
225 查看
快速排序的总体平均效率是最好的。
要领:
1. 选取轴点(枢轴)pivot;
2. 循环加递归,把比pivot小的放在左侧,大的放在右侧。
Partition函数(选取pivot的函数)要做的,就是先选取当中的一个关键字,然后想尽办法将它放到一个位置,使得它左边的值都比它小,右边的值比它大。我们将这样的关键字称为枢轴(pivot)。
在最优的情况下,快速排序算法的时间复杂度为O(nlogn)。
在最坏的情况下,待排序的序列为正序或者逆序,时间复杂度为O(n2)。
就空间复杂度来说,主要是递归造成的栈空间的使用,最好情况,递归树的深度为log2n,其空间复杂度也就为O(logn)。最坏情况,需要进行n-1递归调用,其空间复杂度为O(n),平均情况,空间复杂度也为O(logn)。
可惜的是,由于关键字的比较和交换是跳跃进行的,因此,快速排序是一种不稳定的排序方法。
测试用例:
快排函数实现:
此版本复杂度较高,可有其他优化版本
要领:
1. 选取轴点(枢轴)pivot;
2. 循环加递归,把比pivot小的放在左侧,大的放在右侧。
Partition函数(选取pivot的函数)要做的,就是先选取当中的一个关键字,然后想尽办法将它放到一个位置,使得它左边的值都比它小,右边的值比它大。我们将这样的关键字称为枢轴(pivot)。
在最优的情况下,快速排序算法的时间复杂度为O(nlogn)。
在最坏的情况下,待排序的序列为正序或者逆序,时间复杂度为O(n2)。
就空间复杂度来说,主要是递归造成的栈空间的使用,最好情况,递归树的深度为log2n,其空间复杂度也就为O(logn)。最坏情况,需要进行n-1递归调用,其空间复杂度为O(n),平均情况,空间复杂度也为O(logn)。
可惜的是,由于关键字的比较和交换是跳跃进行的,因此,快速排序是一种不稳定的排序方法。
测试用例:
//测试用例 int main(){ //待排序数组 int arr[10] = {34, 55, 12, 34, 234, 57, 57, 89, 123, 7}; //遍历数组 for(auto i = 0; i < 10; ++i) std::cout << arr[i] << " "; std::cout << std::endl; //快排 QuickSort(arr, 0, 9); //参数:数组名,开始下标位置, 结束下标位置 //遍历排序后的数组 for(auto i = 0; i < 10; ++i) std::cout << arr[i] << " ";//Output: 7 12 34 34 55 57 57 89 123 234 return 0; }
快排函数实现:
//选取枢轴(轴点) int Partition(int *data, int low, int height){ //输入是否合法 if(data == NULL || low < 0 || height <= 0) throw new std::exception("Invalid parameters."); //将第一个值作为枢轴值 int pivotValue = data[low]; //使得pivot左边的值比它小,右边的值比它大 while(low < height){ //内部两个循环比较 while(low < height && data[height] >= pivotValue) //大于轴值不作交换,因为其本身就在轴值右侧 height--; std::swap(data[low], data[height]); //否则,将小于枢轴值的交换到底端 while(low < height && data[low] <= pivotValue) //小于轴值不做交换,因为其本身就在轴值左侧 low++; std::swap(data[low], data[height]); //否则,将大于枢轴值的交换到高端 } return low; //返回枢轴所在的位置 } //快排,递归的 void QuickSort(int *data, int low, int height){ //先判断,也是递归基 if(low == height) return; //选定枢轴 int pivot; if(low < height){ //定枢轴 pivot = Partition(data, low, height); //以枢轴为界 QuickSort(data, low, pivot - 1); //对左侧递归排序 QuickSort(data, pivot + 1, height); //对右侧递归排序 } }
此版本复杂度较高,可有其他优化版本
相关文章推荐
- java cache过期策略两种实现,一个基于list轮询一个基于timer定时
- HTML转义为实体,实体转回为HTML,特殊字符转换
- GridView监听器
- bzoj1529 [POI2005]ska Piggy banks
- TCP/IP入门(4) --应用层
- LeetCode Linked List Cycle II
- DH算法证明及相应的理论知识
- C# winform windows服务安装与卸载
- [从头学python] 第07节 numpy的盘点
- TCP/IP入门(3) --传输层
- 高可用,和负载均衡的简单理解
- TCP/IP入门(2) --网络层
- 机器学习入门学习资源
- 蓝桥杯 算法提高 日期计算
- 使用Handler下载数据
- 每天一个Linux命令(23)chmod命令
- useBean、setProperty、getProperty的用法
- TCP/IP入门(1) --链路层
- 刻在英国威斯敏斯特大教堂的一块墓碑上的话
- 在窗口小部件里快速设置如何默认同步关闭