這個快速排序是快速排序的最初版本,是由C.A.R.Hoare設計的。基本思路:
1.將待排序數據存入一維數組中,然後以第一個值爲基準值。起初i指向第一個元素,j指向最後一個元素之後的位置。
2.分別從兩端遍歷數組,直到i所指向的值比基準值大,以及j所指向的值比基準值小時,分別停止遍歷,然後交換i,j所指向的值。
3.重複步驟2,直到i >= j,然後交換p和j所指向的值,此時序列別分隔成兩部分,基準值右邊的值都比基準值大,而左邊的元素都比基準值小。
4.分別對左右兩部分重複1-4步驟,即可完成排序。(如下圖)
/* * 名稱:快速排序 * 作者:Brooke gao * 時間:2013/6/17 * 注:此算法來自《計算機算法設計與分析》王曉東 編 * */ #include <stdio.h> #define SIZE 100 void swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } int Partition(int *A, int p, int r) { int i, j, x; i = p; j = r + 1; x = A[p]; while(1) { while(A[++i] < x); while(A[--j] > x); if(i >= j) break; swap(&A[i],&A[j]); } A[p] = A[j]; A[j] = x; return j; } void QuickSort(int *A, int p, int r) { int q; if(p < r) { q = Partition(A,p,r); QuickSort(A,p,q-1); QuickSort(A,q+1,r); } } void PrintResult(int *A, int size) { int i; for(i = 0; i < size; i++) { printf("%-2d",A[i]); } putchar('\n'); } int main(void) { int A[SIZE], i, sum; printf("輸入要排序元素的個數(0-100): "); scanf("%d",&sum); printf("請輸入%d個整數:\n",sum); for(i = 0; i < sum; i++) { scanf("%d",&A[i]); } QuickSort(A,0,sum-1); printf("排序結果:\n"); PrintResult(A,sum); }