C语言精简快排代码,带注释
好久不写博,今天又学快排,想想自己也只是知道思想,不曾真正写过。找了个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调了好久。
写的时候,最好在纸上画画,结合调试(我有点太依赖调试了,所以费时间),最佳实践啦~~
作者“青禾”
补充:软件开发 , C语言 ,