好久不寫博,今天又學快排,想想自己也只是知道思想,不曾真正寫過。找了個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調了好久。
寫的時候,最好在紙上畫畫,結合調試(我有點太依賴調試了,所以費時間),最佳實踐啦~~
作者“青禾”