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