基本思想:
1、先從數列中選取一個數作爲基準數
2、分區過程,將比基準數打的數全部放到它的右邊,小於或等於基準數的放到它的左邊
3、再對左右分區重複第二步,知道各區間只有一個數
例如對數列 6,1,2,7,9,3,4,5,10,8
爲了方便,選擇數列的第一個作爲基準數。
此刻,i = 6, j = 8, 先從序列的兩端開始探測,先從右往左找一個小於6的數,找到了就在那個數上方停下,然後i再從左往右找一個大於6的數。然後交換。
第一次交換後得:
6,1,2,5,9,3,4,7,10,8
j繼續向前,找一個小於6的數,找到了就在那個數上方停下,然後i再從左往右找一個大於6的數。然後交換。
第二次交換後得:
6,1,2,5,4,3,9,7,10,8
然後j向前,找到3,同時i向右,與j相遇,第一次探測結束。6和3交換位置。
左右分區類似思想。
#include <stdio.h>
int a[101],n;//定義全局變量,這兩個變量需要在子函數中使用
void quicksort(int left,int right)
{
int i,j,t,key;
if(left>right)
return;
key=a[left]; //temp中存的就是基準數
i=left;
j=right;
while(i!=j)
{
//順序很重要,要先從右邊開始找
while(a[j]>=key && i<j)
j--;
//再找右邊的
while(a[i]<=key && i<j)
i++;
//交換兩個數在數組中的位置
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//最終將基準數歸位
a[left]=a[i];
a[i]=key;
quicksort(left,i-1);//繼續處理左邊的,這裏是一個遞歸的過程
quicksort(i+1,right);//繼續處理右邊的 ,這裏是一個遞歸的過程
}
int main()
{
int i,j,t;
//讀入數據
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
//輸出輸入後的結果
for(i=1;i<=n;i++)
printf("%d ",a[i]);
quicksort(1,n); //快速排序調用
//輸出排序後的結果
for(i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}
結果: