基数排序

来源:互联网 发布:交换机 mac 编辑:程序博客网 时间:2024/06/05 10:52
 

利用的就是计数排序的原理,复杂度也是O(n)

 

最初的数据

排好个位的数据

排好十位的数据

排好百位的数据

981

981

725

129

387

753

129

387

753

955

753

456

129

725

955

725

955

456

456

753

725

387

981

955

456

129

387

981

 

具体算法就忽略掉了,反正利用计数排序的思想,从最低位开始,

想像的程序和实际编出来的确实差很多,本以为利用计数排序很简单,应该一下子就ok了,但是还是遇到了问题,在此纪念一下,果然要编,编,编

#include <stdio.h>   #include <stdlib.h>     void countsort(int radix[],int ndata[],int newdata[],int begin,int end);  void radixsort(int ndata[],int newdata[],int begin,int end);    int main()  {      int nData[8] = {124,125,137,180,323,333,120,233};    //创建10个数据,测试       int newdata[8];      radixsort(nData, newdata,0,7);        //调用插入排序         for (int i = 0; i < 8; ++i)              {          printf("%d ", newdata[i]);      }        printf("/n");      system("puase");        return 0;  }    void radixsort(int ndata[],int newdata[],int begin,int end)  {      int radix[8];      int base=1;        for(int j=0;j<3;j++)      {          base*=10;          for (int i = 0; i <=end; ++i)          {              radix[i] = ndata[i] % base;              radix[i] /= base / 10;          }            countsort(radix,ndata,newdata,begin,end);      }    }          void countsort(int radix[],int ndata[],int newdata[],int begin,int end)  {      int c[10];      for(int i=0;i<10;i++)          c[i]=0;      for(i=0;i<=end;i++)          c[radix[i]]++;      for(i=1;i<=9;i++)          c[i]=c[i]+c[i-1];      for(i=end;i>=0;i--)      {          newdata[c[radix[i]]-1]=ndata[i];          c[radix[i]]--;      }      for(i=0;i<=end;i++)          ndata[i]=newdata[i];  }  


 

问题出在:第一次各位排序好后,十位进行排序,则把各位的给排乱了,

 

因为在radixsort中还是用ndata进行排序,这时应该用牌好的数据newdata进行,加完最后一句话,调试成功

 

且,应该最后能够自己判断是否到最高位了

 

可以设置一个flag标志,isok进行判断

 

 

 

原创粉丝点击