很久不寫博,今天又學快排,想一想本身也只是知道思想,未曾真正寫過。找了個ACM題練手Hdu1106,主要是ACM的有數據,方便知道本身的對不對。數組
寫的時間雖然久了點,可是弄出來了,仍是有成就感的,沒看書什麼的,只憑指導思想本身思考的那種方式寫的,比較喜歡這種Coding的方式。好了,廢話少說,上菜。ide
- /**
- @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調了很久。ui
寫的時候,最好在紙上畫畫,結合調試(我有點太依賴調試了,因此費時間),最佳實踐啦~~spa