利用的就是计数排序的原理,复杂度也是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进行判断