基数排序思想:分配桶,把待排序的数字按照从低到高的顺序排列。主要有两个过程,分配和收集。
分配时,根据数字的位数,从小到大存放到桶中。
收集时,按照顺序,再覆盖原数组。
重复分配和收集的过程,直到到数字的最高位。
好长时间不写C++代码了。。。
代码如下:
#include <iostream> #include <cstdlib> using namespace std; int getNumInPos(int num,int k) { int temp=1; for(int i=1;i<k;i++) { temp*=10; } return (num/temp)%10; } void radix_sort(int arr[],int n,int k) { int *radix_arr[10]; for(int i=0;i<n;i++) { radix_arr[i]=(int *)malloc(sizeof(int)*(n+1));//分配桶 radix_arr[i][0]=0; } for(int j=1;j<=k;j++) { int t; //分配数据分配到桶中 for(int i=0;i<n;i++) { int digit=getNumInPos(arr[i],j); int index=++radix_arr[digit][0]; radix_arr[digit][index]=arr[i]; } //从桶中收集数据 for(int i=0,t=0;i<n;i++) { for( int m=1;m<=radix_arr[i][0];m++) { arr[t++]=radix_arr[i][m]; } radix_arr[i][0]=0; } } } void print_arr(int arr[],int n) { for(int i=0;i<n;i++) printf("%d,",arr[i]); printf(" "); } int main() { int arr[10]={123,243,521,213,67,12,7,90,101,321}; printf("基数排序前:"); print_arr(arr,10); radix_sort(arr,10,3); printf("基数排序后:"); print_arr(arr,10); return 0; }
运行结果: