快速排序基本思想是,一趟排序,選擇一個元素作為樞軸,然後將所有比樞軸小的元素放到樞軸的左邊,將比樞軸大的元素放到樞軸的右邊,這樣的一趟排序也稱為一次劃分。然後對該樞軸劃分的左右子序列分別再進行劃分,如此遞歸。就平均時間而言,快速排序是目前被認為是最好的一種內部排序方法,其平均時間是O(nlogn),最壞情況是O(n2)(是n方),最壞的情況就是如下倒序完後再正序排的情況。
C++代碼如下:
#include "stdafx.h"
#define MAXSIZE 20
typedef struct{
int r[MAXSIZE+1];
int len;
}SqList;
int Partition(SqList &L, int low, int high)
{
L.r[0] = L.r[low]; // 以第一個元素作為樞軸
int pivotkey = L.r[low];// 記錄樞軸關鍵字
while (low < high)
{
while(low<high && L.r[high]>=pivotkey)
--high;// 找到從high位置開始向前第一個比樞軸小的元素
L.r[low] = L.r[high];// 將找到的比樞軸小的元素放到前邊的空閒位置
while(low<high && L.r[low]<=pivotkey)
++low;// 找到從low位置開始向後第一個比樞軸大的元素
L.r[high] = L.r[low];// 將找到的比樞軸大的元素放到後邊的空閒位置
}
L.r[low] = L.r[0];// 將樞軸放回中間的空閒位置
return low;
}
void QSort(SqList &L, int low, int high)
{
if (low < high)
{
int pivotloc = Partition(L, low, high);
QSort(L, low, pivotloc-1);
QSort(L, pivotloc+1, high);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
SqList sqList;
for (int i=1; i<MAXSIZE+1; i++)
{
sqList.r[i] = MAXSIZE - i;
}
sqList.len = MAXSIZE;
QSort(sqList, 1, sqList.len);
return 0;
}
// 附一次劃分過程,第一行為index,第二行為待排序序列 // 0 1 2 3 4 5 6 7 // __ 49 38 65 97 76 13 27 // 開始時,0號位空閒(low:1, high:7) // 49 __ 38 65 97 76 13 27 // 將第1號元素作為樞軸,放到0號位,1號位冗余(low:1, high:7) // 49 27 38 65 97 76 13 __ // 發現27比49小,將7號位值放到1號位,7號位冗余(low:1, high:7) // 49 27 38 __ 97 76 13 65 // 發現65比49大,將3號位值放到7號位,3號位冗余(low:3, high:7) // 49 27 38 13 97 76 __ 65 // 發現13比49小,將6號位值放到3號位,6號位冗余(low:3, high:6) // 49 27 38 13 __ 76 97 65 // 發現97比49大,將4號位值放到6號位,4號位冗余(low:4, high:5) // __ 27 38 13 49 76 97 65 // low == high,將樞軸放到4號位,此時49左邊的都比49小,右邊的都比49大