快速排序設計思想:
- 找一個記錄(例如取第一個記錄),以它的關鍵字作爲“樞軸”。
- 凡其關鍵字小於樞軸的記錄均移動至該紀錄“之前”。
- 凡其關鍵字大於樞軸的記錄均移動至該紀錄“之後”。 即對無序的記錄序列進行一次劃分。
- 之後分別對分割所得兩個子序列“遞歸”進行快速排序,
快速排序的具體分析:
- 設兩個下標 i 和 j 。i 標記整個序列的起始位置,j 標記整個序列最後一個元素所在的位置。接着使用一個臨時變量,先保存樞軸的值21。
- 保存完畢以後,先從右邊找到一個比樞軸的值小的值。如果找到以後,兩者之間進行交換。如果未找到,進行 j - 1操作。首先將37與21進行比較,不小,將 j 向前移動,將52與21進行比較,不小,繼續將 j 向前移,將8與21比較。此時8小於21,將8和21進行交換。即將8存放在下標爲0的位置上。此時j的下標爲5.
- 接着從左邊開始找到一個比樞軸值大的值,首先進行 i +1 操作。若找到,將兩者進行交換,否則進行 i + 1操作。此時25>21,即25應該到 j 所標記的位置。
經過交換後,應該是:
- 下一步繼續從右邊找到一個比樞軸小的值進行交換;
- 再從左邊找到一個比樞軸值大的值進行交換:
- 整個步驟全是右面找一次,左邊找一次。直到 i 和 j 相等時 完成一趟快速排序。
- 最後將21的這個值存放在 i 等於 j 的位置上。
- 以上爲第一趟快速排序
- 之後分別對兩個子序列進行快速排序
快速排序代碼如下:
#include<stdio.h>
int a[9]={7,1,2,4,2,5,8,7,9};
int Partition(int low, int high)
{
int pivotkey = a[low]; //樞軸記錄關鍵字
while(low < high) //從兩端交替地向中間掃描
{
while(low < high && a[high] >= pivotkey)
high--; //將比樞軸記錄小的記錄移到低端
a[low]=a[high];
while(low < high && a[low] <= pivotkey)
low++; // 將比樞軸記錄大的記錄移到高端
a[high]=a[low];
}
a[high] = pivotkey; //樞軸記錄到位
return low;
}
void Qsort(int low,int high)
{
if(low < high) //長度 > 1
{
int pivoloc = Partition(low,high); //將其一分爲二
Qsort(low,pivoloc-1); //對左半部分進行遞歸排序,pivoloc是樞軸位置
Qsort(pivoloc+1,high); //對右半部分進行遞歸排序
}
}
int main()
{
int i;
Qsort(0,8);
for(i=0;i<9;i++)
printf("%d ",a[i]);
return 0;
}