关于快速排序(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都是比较理想的。

其次,分段时可以划分三段,将数组相同的划分为一段,不用继续进行分段,这个方法有效地避免了数组中相同数字较多的情况。

        最后,数组规模较小的时候,快速排序的效率是不理想的,可以改用插入排序。

原创粉丝点击