遞歸實現快速排序


 #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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM