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

    很久不寫博,今天又學快排,想一想本身也只是知道思想,未曾真正寫過。找了個ACM題練手Hdu1106,主要是ACM的有數據,方便知道本身的對不對。數組

    寫的時間雖然久了點,可是弄出來了,仍是有成就感的,沒看書什麼的,只憑指導思想本身思考的那種方式寫的,比較喜歡這種Coding的方式。好了,廢話少說,上菜。ide

  
  
  
  
  1. /** 
  2. @r:要排序的數組 
  3. @s:排的起點,從0開始 
  4. @e:排的終點,從n-1開始 
  5. */ 
  6. void quicksort(int r[1001],int s,int e) 
  7.    int t = r[s];//哨兵,爲開頭的那個 
  8.    int f = s+1; 
  9.    int b = e;//f爲前向指針,從s+1開始,b爲反向指針,從e開始 
  10.    int m = 0; 
  11.    if(s>=e)return;//退出條件 
  12.     
  13.    while(f<=b) 
  14.    { 
  15.        while(f<=b&&r[f]<=t) f++;//在前面找比哨兵大的元素 
  16.        while(f<=b&&r[b]>=t) b--;//在後面找比哨兵小的元素 
  17.        //交換這兩個元素 
  18.        if(f<b){ 
  19.             m = r[f]; 
  20.             r[f] = r[b]; 
  21.             r[b] = m; 
  22.             f++;    b--; 
  23.        } 
  24.    } 
  25.    //交換哨兵和r[b],r[b]確定要比哨兵小 
  26.    r[s] = r[b]; 
  27.    r[b] = t; 
  28.    //排兩邊的 
  29.    quicksort(r,s,b-1); 
  30.    quicksort(r,b+1,e); 

注意有重複鍵的這種狀況,好比要排的數據是1,1,1,1。這個bug調了很久。ui

寫的時候,最好在紙上畫畫,結合調試(我有點太依賴調試了,因此費時間),最佳實踐啦~~spa

相關文章
相關標籤/搜索