好久不写博,今天又学快排,想想自己也只是知道思想,不曾真正写过。找了个ACM题练手Hdu1106,主要是ACM的有数据,方便知道自己的对不对。

    写的时间虽然久了点,但是弄出来了,还是有成就感的,没看书什么的,只凭指导思想自己思考的那种方式写的,比较喜欢这种Coding的方式。好了,废话少说,上菜。

 
  
  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调了好久。

写的时候,最好在纸上画画,结合调试(我有点太依赖调试了,所以费时间),最佳实践啦~~