基数排序
来源:互联网 发布:交换机 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进行判断