排序算法(六):快速排序

来源:互联网 发布:企鹅网络加速器 编辑:程序博客网 时间:2024/06/06 00:21

ps:虽然是转载的,但是代码是自己重新写过的。

基本思想:

1)选择一个基准元素,通常选择第一个元素或者最后一个元素,

2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。

3)此时基准元素在其排好序后的正确位置

4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。

快速排序的示例:

(a)一趟排序的过程:

(b)排序的全过程


算法的实现:

#include <iostream>using namespace std;void Print(int a[], int low, int high){for (int i = low;i <= high;i++){cout << a[i] << " ";}cout << endl;}void Swap(int & p, int & q){int tmp = p;p = q;q = tmp;}void QuickSort(int a[], int low, int high){int lowT, highT;lowT = low;highT = high;int key = a[low];while (low < high){while (low < high && key < a[high])high--;Swap(a[low], a[high]);while (low < high && a[low] < key)low++;Swap(a[low], a[high]);}cout << "low=" << lowT << ",high=" << highT << endl;Print(a, lowT, highT);if (lowT < low - 1)QuickSort(a, lowT, low - 1);if (high < highT - 1)QuickSort(a, low + 1, highT);}int main(){int a[] = { 3,9,6,5,7,2,4,10,8,1 };QuickSort(a, 0, 9);cout << "result:" << endl;Print(a, 0, 9);system("pause");}

分析:

快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。为改进之,通常以“三者取中法”来选取基准记录,即将排序区间的两个端点与中点三个记录关键码居中的调整为支点记录。快速排序是一个不稳定的排序方法。


0 0
原创粉丝点击