基数排序-----链表的应用
code:
/* 基数排序 思路:10个桶,按0-9排好序,首先计算各位数,末尾哪个数,就放到哪个桶去 易错点:不能由高位向低位比较,只能有低位先比较,然后到高位(两个数相同,但是顺序是错的,导致由高位就会出现问题) 找出最大位数,然后根据最大位数就能决定要循环多少遍 1.计数初始化,然后从个位开始,每次找到个位i,然后在cout[i]++,记住每个数 2.将每个count叠加,记录最多多少个数 3.从高位开始存储,放到相应辅助函数中,然后再更新data[]数据 重复以上,最终得到的data[]就是我们拍好的值 */ #include <iostream> using namespace std; int maxbit(int data[],int n)//辅助函数,求数据的最大位数 { int d=1;//保存最大的位数 int p=10; for(int i=0;i<n;++i) { while(data[i]>=p) { p*=10; ++d; } } return d; } void radixsort(int data[],int n)//基数排序 { int d=maxbit(data,n);//最大位数 int* tmp=new int[n]; int* count=new int[10];//计数器 int i,j,k; int radix=1; for(i=1;i<=d;i++)//进行d次排序 { for(j=0;j<10;j++) count[j]=0;//每次分配前清空计数器 for(j=0;j<n;j++) //计算每位有多少个数 { k=(data[j]/radix)%10;//统计每个桶中的记录数 count[k]++; } for(j=1;j<10;j++) count[j]=count[j-1]+count[j];//将tmp中的位置依次分配给每个桶 for(j=n-1;j>=0;j--)//将所有桶中记录依次收集到tmp中 { k=(data[j]/radix)%10; tmp[count[k]-1]=data[j]; count[k]--; } for(j=0;j<n;j++)//将临时数组的内容复制到data中 data[j]=tmp[j]; radix=radix*10; } delete[]tmp; delete[]count; } int main(){ int s[]={1,4,56,61,72,1000,234,651,4}; radixsort(s,9); for(int i= 0;i <9;i++) cout <<s[i]<<" "; cout <<endl; return 0; }