算法--快速排序
来源:互联网 发布:java log4j 日志格式 编辑:程序博客网 时间:2024/06/06 22:24
排序
快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
分治法的基本思想
分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
时间 平均O(nlog n), 最坏O(n^2),原始序列有序或,基本有序的情况下,算法性能最坏。
空间 平均O(log n), 最坏O(n^2),同上,最坏情况下,每次将n个元素的带排序列分成1个和n-1个。需要递归n次,即栈空间也是2n = (low + high) * n = (1 + 1) *n
不是很精通算法的分析,只能照本宣科的说说自己知道的。不过大抵能体会到核心思想。
具体的深入分析,我就不ctrl + c ctrl + v了,附上大神们的深度分析。
http://blog.csdn.net/v_JULY_v/article/details/6211155
归并排序和快速排序都应用分治的思想。二者的区别是,快速排序在“分”的上面比较复杂,对应的是partition()这个函数;在“治”上很简单,就是没有。而归并排序在“分”上很简单,就是二分法;在“治”上较复杂。
快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
分治法的基本思想
分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
int pivotPartition(int a[], int low, int high){ // 在a[low ~ high]范围内 // 以a[low]为轴,找到a[low]的最终位置,使得在该位置以前都比a[low小], // 之后都比a[low]大。 // 并且返回a[low]的位置。 if(low >= high) return low; int pivot = a[low]; while(low < high) { while(low < high && pivot <= a[high]) --high; a[low] = a[high]; while(low < high && pivot >= a[low]) ++low; a[high] = a[low]; } a[low] = pivot; return low;}
void QuickSort(int a[], int n){ // 非递归算法形式,使用栈。 if(!positiveCheck_0out(n)) return ; int *filoStack = new int[n]; int top = -1; /// low 先进,high后进。 filoStack[++top] = 0; filoStack[++top] = n - 1; int low, high; int pivot; while(top >= 0) { high = filoStack[top--]; low = filoStack[top--]; pivot = pivotPartition(a, low, high); if(pivot - 1 > low) { filoStack[++top] = low; filoStack[++top] = pivot - 1; } if(pivot + 1 < high) { filoStack[++top] = pivot + 1; filoStack[++top] = high; } } delete[] filoStack;}
时间 平均O(nlog n), 最坏O(n^2),原始序列有序或,基本有序的情况下,算法性能最坏。
空间 平均O(log n), 最坏O(n^2),同上,最坏情况下,每次将n个元素的带排序列分成1个和n-1个。需要递归n次,即栈空间也是2n = (low + high) * n = (1 + 1) *n
不是很精通算法的分析,只能照本宣科的说说自己知道的。不过大抵能体会到核心思想。
具体的深入分析,我就不ctrl + c ctrl + v了,附上大神们的深度分析。
http://blog.csdn.net/v_JULY_v/article/details/6211155
归并排序和快速排序都应用分治的思想。二者的区别是,快速排序在“分”的上面比较复杂,对应的是partition()这个函数;在“治”上很简单,就是没有。而归并排序在“分”上很简单,就是二分法;在“治”上较复杂。
0 0
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法------快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法---快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法:快速排序
- 排序算法 快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 【排序算法】快速排序
- 排序算法--快速排序
- 排序算法:快速排序
- 中华藏獒王"嘉玛"首例纯种藏獒克隆项目成功
- H265/H264/Mjpeg/mpeg
- vs2010下mfc界面开发,关于禁止拉伸界面
- mysql以blob存储图片文件的存储和读取问题解决
- [ExtJS5学习笔记]第二十三节 Extjs5中表格gridpanel的列格式设置
- 算法--快速排序
- 柯震东经纪人柴智屏被大陆限制出境 疑涉刑事犯罪
- MySQL体系结构详解
- 3.4.1.2 在 F# 中传递函数作为参数值
- C#对不同版本IIS的控制方法
- BestCoder No.11 总结
- 东莞"女德班"被责令停办 学员被遣散并退回学费
- iOS应用崩溃日志分析
- 点击轮播图片左右按钮,实现轮播效果