快速排序算法是在实际应用中经常用到的排序算法。STL中的sort()算法就是使用快速排序算法。快速排序算法的平均统计性能是O(nlogn)。虽然堆排序算法的平均统计性能也是O(nlogn),但快速排序算法的系数要比堆排序的要小,因此总体统计性能要优于堆排序算法。不过,快速排序算法的最差统计性能是O(n2),要差于堆排序的O(nlogn),因此在实际应用中快速排序算法的性能太差的话,也可能使用堆排序这种具有稳定统计性能的排序算法。
下面是快速排序算法的实现:
template
<
typename T
>
void
QuickSort(T
*
a,
int
l,
int
r)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int i = l, j = r;
T x = a[(l + r) / 2]; //求中间值
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
do...{
while ((a[i] < x) && (i < r)) i++; //从左扫描大于中值的数
while ((a[j] > x) && (j > l)) j--; //从右扫描大于中值的数
if(i <= j) swap(a[j--], a[i++]); //找到了一对值后进行交换
}while (i <= j); //如果两边扫描的下标交错,就停止(完成一次)
if (l < j) QuickSort(a, l, j); //当左边部分有值(l < j),递归左半边
if (i < r) QuickSort(a, i, r); //当右边部分有值(i < r),递归右半边
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
template
<
typename T
>
void
QuickSort(T
*
a,
int
Count)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
QuickSort(a, 0, Count - 1);
}
它的工作看起来象一个二叉树。首先我们选择一个中间值x,程序中我们使用数组中间值,然后把比它小的放在左边,大的放在右边(具体的实现是从两边找,找到一对后交换)。然后对两边分别使用这个过程(最容易的方法——递归)。注意,由于数据的随机性,对x的选择并不会影响该算法的效率。
注意,在扫描过程中,对于给定参考值,对于向右(左)扫描,如果扫描值大(小)于或等于参考值,就需要进行交换。最终得到的结果是,j左边的值都小于参考值,而i右边的值都大于参考值,j和i之间的值都等于参考值。对j左边和i右边的分别使用递归,就可以完成最终的排序。