您的位置:首页 > 编程语言 > C语言/C++

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

2015-11-09 18:00 357 查看
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))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。为改进之,通常以“三者取中法”来选取基准记录,即将排序区间的两个端点与中点三个记录关键码居中的调整为支点记录。快速排序是一个不稳定的排序方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 排序算法 C++