方法其實很簡單:分別從初始序列「6 1 2 7 9 3 4 5 10 8」兩端開始「探測」。先從右往左找一個小於6的數,再從左往右找一個大於6的數,而後交換他們。這裏能夠用兩個變量i和j,分別指向序列最左邊和最右邊。咱們爲這兩個變量起個好聽的名字「哨兵i」和「哨兵j」。剛開始的時候讓哨兵i指向序列的最左邊(即i=1),指向數字6。讓哨兵j指向序列的最右邊(即j=10),指向數字8。c++
如今交換哨兵i和哨兵j所指向的元素的值。交換以後的序列以下。算法
#include <stdio.h> int a[101],n;//定義全局變量,這兩個變量須要在子函數中使用 void quicksort(int left, int right) { int i, j, t, temp; if(left > right) return; temp = a[left]; //temp中存的就是基準數 i = left; j = right; while(i != j) { //順序很重要,要先從右邊開始找 while(a[j] >= temp && i < j) j--; while(a[i] <= temp && i < j)//再找右邊的 i++; if(i < j)//交換兩個數在數組中的位置 { t = a[i]; a[i] = a[j]; a[j] = t; } } //最終將基準數歸位 a[left] = a[i]; a[i] = temp; quicksort(left, i-1);//繼續處理左邊的,這裏是一個遞歸的過程 quicksort(i+1, right);//繼續處理右邊的 ,這裏是一個遞歸的過程 } int main() { int i; //讀入數據 scanf("%d", &n); for(i = 1; i <= n; i++) scanf("%d", &a[i]); quicksort(1, n); //快速排序調用 //輸出排序後的結果 for(i = 1; i < n; i++) printf("%d ", a[i]); printf("%d\n", a[n]); return 0;