关于快速排序(quick sort)及其改进
来源:互联网 发布:关于网络鬼片 编辑:程序博客网 时间:2024/06/05 10:34
快速排序的基本思想是分治:每次选定一个key,然后遍历数组或数组的一部分,并将它划分为两段,一段里面的数都比key小,另一段里面的都比key大,然后针对每一段又进行以上处理。最后,每一段里面都是有序的,而且段与段之间也是有序的,从而整个数组也是有序的。
代码实现如下:
void QSort(int *pArr, int iBegin, int iEnd){int iPos = -1;if ((iEnd > iBegin) && (NULL != pArr)){iPos = GetPos(pArr, iBegin, iEnd);qSort(pArr, iBegin, iPos - 1);qSort(pArr, iPos + 1, iEnd);}}int GetPos(int *pArr, int iBegin, int iEnd){int iKey = pArr[iBegin];int i = iBegin;int j = iEnd - 1;while (j > i){while ((iEnd > iBegin) && (pArr[iEnd] >= iKey)){iEnd--;}pArr[iBegin] = pArr[iEnd];while ((iEnd > iBegin) && (pArr[iBegin] <= iKey)){iBegin++;}pArr[iEnd] =pArr[iBegin];}pArr[iBegin] = iKey;return iBegin;}
快速排序的效率很大的程度上取决于Key的选择,如果每次选取的Key分段里面最大或最小的,那么快排的效率就无限接近于O(N^2),这是最坏情况。而如果key每次刚好是最中间的值,那么划分的两段数据分布一样平均,效率就会最接近nlog(n),这是最好的情况。
基本的快速排序方法通常难以达到较理想的效率,例如,基本快速排序方法每次选取第一个元素作为key,并且划分两段,在数组有序或者相同数字较多的情况下,效率无限接近O(n^2)......
当然,我们可以对基本快速排序方法进行改进,使之达到我们想要的效果。
首先一种,选择key的时候不选第一个元素,而是从第一个值、最后一个值即中间一个值中选择一个中值,在平均情况下,这个key都是比较理想的。
其次,分段时可以划分三段,将数组相同的划分为一段,不用继续进行分段,这个方法有效地避免了数组中相同数字较多的情况。
最后,数组规模较小的时候,快速排序的效率是不理想的,可以改用插入排序。
- 关于快速排序(quick sort)及其改进
- 关于快速排序 quick sort
- 快速排序(quick sort)
- 快速排序(quick sort)
- 快速排序(quick sort)
- 快速排序(Quick Sort)
- 快速排序(Quick sort)
- 快速排序(Quick Sort)
- 快速排序(Quick Sort)
- 快速排序(Quick Sort)
- 快速排序(Quick Sort)
- 快速排序(Quick Sort)
- Quick Sort(快速排序)
- 快速排序(quick sort)
- 快速排序(Quick-Sort)
- 快速排序 Quick Sort
- 快速排序(Quick sort)
- quick sort 快速排序
- 黑马程序员--多线程(一)
- java classpath
- Codeforces Round #180 (Div. 1)(完全)
- 女神瓦萨比-小黑中国力鉴淘宝给力明星店
- Hibernate中inverse属性-详细介绍
- 关于快速排序(quick sort)及其改进
- 苏一辰高精度乘法
- Git的一些入门知识
- adobe air 和 flash builder 和 flex 和flax 的区别。 越简单直观越好,不要官网的粘贴,看不懂。
- 黑马程序员--多线程(二)
- effective c++ 学习总结(第三章)
- Fuck libev (1) 第一个可运行例子
- Starling特色介绍
- How to Debug Programs