好久不写博,今天又学快排,想想自己也只是知道思想,不曾真正写过。找了个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调了好久。
写的时候,最好在纸上画画,结合调试(我有点太依赖调试了,所以费时间),最佳实践啦~~
转载于:https://blog.51cto.com/snowteng17/669554