#include <stdio.h> #include <stdlib.h> #include <time.h> int r[20001]; void main() { int i,n,t; void qk(int m1,int m2); // 函數聲明 t=time(0)%1000;srand(t); // 隨機數發生器初始化 printf(" input n:"); scanf("%d",&n); printf(" 參與排序的%d個整數為:\n",n); for(i=1;i<=n;i++) {r[i]=rand()%(4*n)+10; // 隨機產生並輸出n個整數 printf("%d ",r[i]); } qk(1,n); printf(" \n 以上%d個整數從小到大排序為:\n",n); for(i=1;i<=n;i++) printf("%d ",r[i]); // 輸出排序結果 printf("\n"); } void qk(int m1,int m2) // 快速排序遞歸函數 { int i,j; if(m1<m2) { i=m1;j=m2;r[0]=r[i]; // 定義第i個數作為分區基准 while(i!=j) { while(r[j]>=r[0] && j>i) // 從右至左逐個檢查是否大於基准 j=j-1; if(i<j) {r[i]=r[j];i=i+1;} // 把小於基准的一個數賦給r(i) while(r[i]<=r[0] && j>i) // 從左至右逐個檢查是否小於基准 i=i+1; if(i<j) {r[j]=r[i];j=j-1;} // 把大於基准的一個數賦給r(j) } // 通過循環完成分區 r[i]=r[0]; // 分區的基准為r(i) qk(m1,i-1); qk(i+1,m2); // 在兩個區中繼續分區 } return; }