35 12 37 -58 54 76 22
1) 首先分別定義 low 和 high 用於儲存陣列第一個元素的下標和最後一個元素的下標,即 low=0,high=6。22 12 37 -58 54 76 35
4) 然後 low++==1,key 和 a[low] 比較,即 35 和 12 比較,12<35,則不用互換位置;繼續 low++==2,然後 key 和 a[low] 比較,即 35 和 37 比較,37>35,則它們互換位置:22 12 35 -58 54 76 37
5) 然後 high--==5,key 和 a[high] 比較,即 35 和 76 比較,35<76,則不用互換位置;繼續 high--==4,然後 key 和 a[high] 比較,即 35 和 54 比較,35<54,則不用互換位置;繼續 high--==3,然後 key 和 a[high] 比較,即 35 和 -58 比較,35>–58,則它們互換位置:22 12 -58 35 54 76 37
6) 然後 low++==3,此時 low==high,第一輪比較結束。從最後得到的序列可以看出,35 左邊的都比 35 小,35 右邊的都比 35 大。這樣就以 35 為中心,把原序列分成了左右兩個部分。接下來只需要分別對左右兩個部分分別重複上述操作就行了。# include <stdio.h> void Swap(int *, int *); //函數宣告, 交換兩個變數的值 void QuickSort(int *, int, int); //函數宣告, 快速排序 int main(void) { int i; //迴圈變數 int a[] = {900, 2, -58, 3, 34, 5, 76, 7, 32, 4, 43, 9, 1, 56, 8,-70, 635, -234, 532, 543, 2500}; QuickSort(a, 0, 20); /*參照起來很簡單, 0為第一個元素的下標, 20為最後一個元素的下標*/ printf("最終排序結果為:n"); for (i=0; i<21; ++i) { printf("%d ", a[i]); } printf("n"); return 0; } void Swap(int *p, int *q) { int buf; buf = *p; *p = *q; *q = buf; return; } void QuickSort(int *a, int low, int high) { int i = low; int j = high; int key = a[low]; if (low >= high) //如果low >= high說明排序結束了 { return ; } while (low < high) //該while迴圈結束一次表示比較了一輪 { while (low < high && key <= a[high]) { --high; //向前尋找 } if (key > a[high]) { Swap(&a[low], &a[high]); ++low; } while (low < high && key >= a[low]) { ++low; //向後尋找 } if (key < a[low]) { Swap(&a[low], &a[high]); --high; } } QuickSort(a, i, low-1); //用同樣的方式對分出來的左邊的部分進行同上的做法 QuickSort(a, low+1, j); //用同樣的方式對分出來的右邊的部分進行同上的做法 }輸出結果是:
# include <stdio.h> void QuickSort(int *, int, int); /*現在只需要定義一個函數, 不用交換還省了一個函數, 減少了程式碼量*/ int main(void) { int i; //迴圈變數 int a[] = {900, 2, -58, 3, 34, 5, 76, 7, 32, 4, 43, 9, 1, 56, 8,-70, 635, -234, 532, 543, 2500}; QuickSort(a, 0, 20); /*參照起來很簡單, 0為第一個元素的下標, 20為最後一個元素的下標*/ printf("最終排序結果為:n"); for (i=0; i<21; ++i) { printf("%d ", a[i]); } printf("n"); return 0; } void QuickSort(int *a, int low, int high) { int i = low; int j = high; int key = a[low]; if (low >= high) //如果low >= high說明排序結束了 { return ; } while (low < high) //該while迴圈結束一次表示比較了一輪 { while (low < high && key <= a[high]) { --high; //向前尋找 } if (key > a[high]) { a[low] = a[high]; //直接賦值, 不用交換 ++low; } while (low < high && key >= a[low]) { ++low; //向後尋找 } if (key < a[low]) { a[high] = a[low]; //直接賦值, 不用交換 --high; } } a[low] = key; //查詢完一輪後key值歸位, 不用比較一次就互換一次。此時key值將序列分成左右兩部分 QuickSort(a, i, low-1); //用同樣的方式對分出來的左邊的部分進行同上的做法 QuickSort(a, low+1, j); //用同樣的方式對分出來的右邊的部分進行同上的做法 }輸出結果是:
5 1 9 3 7 4 8 6 2
5 正好處於 1~9 的中間,選擇 5 作基準數可以平衡兩邊的遞迴深度。可如果是:1 5 9 3 7 4 8 6 2
選擇 1 作為基準數,那麼遞迴深度就全部都加到右邊了。如果右邊有幾萬個數的話則系統直接就崩潰了。所以需要對遞迴深度進行優化。怎麼優化呢?就是任意取三個數,一般是取序列的第一個數、中間數和最後一個數,然後選擇這三個數中大小排在中間的那個數作為基準數,這樣起碼能確保獲取的基準數不是兩個極端。