当前位置:编程学习 > C/C++ >>

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语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,