基本思想
1)選擇一個基準元素,通常選擇第一個元素或者最後一個元素,
2)通過一趟排序講待排序的記錄分割成獨立的兩部分,其中一部分記錄的元素值均比基準元素值小。另一部分記錄的 元素值比基準值大。
3)此時基準元素在其排好序後的正確位置
4)然後分別對這兩部分記錄用同樣的方法繼續進行排序,直到整個序列有序。
(a)一趟排序的過程
(b)排序的全過程
算法實現
#include<stdio.h>
typedef int ElemType[10];
//交換數據
void swap(ElemType r,int i,int j){
int temp;
temp = r[i];
r[i] = r[j];
r[j] = temp;
}
//獲取中間元素位置
int partition(ElemType r,int low,int high){
int privoKey = r[low]; //基準元素(值)
while(low < high){ //從表的兩端交替地向中間掃描
while(low<high && r[high]>=privoKey){ //從high 所指位置向前搜索,至多到low+1 位置。將比基準元素小的交換到低端
high--;
}
swap(r,low,high);
while(low<high && r[low]<=privoKey){//從low 所指位置向後搜索,至多到low-1 位置。將比基準元素小的交換到低端
low++;
}
swap(r,low,high);
}
return low;//low和high指向同一位置,即中間位置。
}
void QSort(ElemType r,int low,int high){
if(low<high){
int privotLoc = partition(r,low,high);//將表一分爲二
QSort(r,low,privotLoc-1);//遞歸對低子表遞歸排序
QSort(r,privotLoc+1,high); //遞歸對高子表遞歸排序
}
}
//打印
void print(ElemType r,int n){
int i;
for(i=0;i<n;i++){
printf("%3d",r[i]);
}
printf("\n");
}
int main(){
ElemType r = {3,1,5,7,2,4,9,6,10,8};
printf("排序前:\n");
print(r,10);
printf("快速排序後:\n");
QSort(r,0,9);
print(r,10);
return 0;
}