程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言精簡快排代碼,帶注釋

C語言精簡快排代碼,帶注釋

編輯:關於C語言

   好久不寫博,今天又學快排,想想自己也只是知道思想,不曾真正寫過。找了個ACM題練手Hdu1106,主要是ACM的有數據,方便知道自己的對不對。
    寫的時間雖然久了點,但是弄出來了,還是有成就感的,沒看書什麼的,只憑指導思想自己思考的那種方式寫的,比較喜歡這種Coding的方式。好了,廢話少說,上菜。
/**
@r:要排序的數組
@s:排的起點,從0開始
@e:排的終點,從n-1開始
*/
void quicksort(int r[1001],int s,int e)
{
   int t = r[s];//哨兵,為開頭的那個
   int f = s+1;
   int b = e;//f為前向指針,從s+1開始,b為反向指針,從e開始
   int m = 0;
   if(s>=e)return;//退出條件
   
   while(f<=b)
   {
       while(f<=b&&r[f]<=t) f++;//在前面找比哨兵大的元素
       while(f<=b&&r[b]>=t) b--;//在後面找比哨兵小的元素
       //交換這兩個元素
       if(f<b){
            m = r[f];
            r[f] = r[b];
            r[b] = m;
            f++;    b--;
       }
   }
   //交換哨兵和r[b],r[b]肯定要比哨兵小
   r[s] = r[b];
   r[b] = t;
   //排兩邊的
   quicksort(r,s,b-1);
   quicksort(r,b+1,e);
}
注意有重復鍵的這種情況,比如要排的數據是1,1,1,1。這個bug調了好久。
寫的時候,最好在紙上畫畫,結合調試(我有點太依賴調試了,所以費時間),最佳實踐啦~~
作者“青禾”

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved