int N,i,length,j; int *a; printf("Please input the number of the array:"); scanf("%d", &N); printf("Please input the length of the each_num:"); scanf("%d", &length); a = (int* )malloc(N*sizeof(int)); for(i=0; i<N; i++) scanf("%d",&a[i]); //因为子函数是一次排序,所以要多次 for (j = 0; j < N; j++) radixsort(a, N, length);
for (i = 0 ;i < N; i++) printf("%5d", a[i]); }
// 一次排序的算法 voidradixsort(int *A, int n, int k) { //初始化,其中L大小是一个10*N大小的int型矩阵,假如有一位数字都是0,就全部放进去,所以就是N大小的。 int **L,num[10]; int each_k; int ini; int each_num; int i,j,l;
L = (int**)malloc(10*sizeof(int*)); for (ini = 0; ini < 10; ini++) L[ini] = (int*)malloc(n*sizeof(int)); //用的是中括号
//取某一位的算法 // for ( each_k = 0; each_k < k; ++each_k) // { //因为是新一次的排序,所以清空,num[i]用于记录当前循环放在L[Digit]的数目 for ( ini = 0; ini < 10; ++ini) num[ini] = 0;
for (each_num = 0; each_num < n; ++each_num) { //取出每一位数字,num[Digit]++是为了L[Digit]放入一个数字之后加一,为下一次放数字做准备。 int Digit = (A[each_num]/order)%10; L[Digit][num[Digit]++] = A[each_num]; }
// }
//将这次排序出来的结果连接成为一个新的数组
int m = 0; for (j = 0; j < 10; ++j) for (l = 0; l < num[j]; ++l) A[m++] = L[j][l];
order *= 10;
for (ini = 0; ini < 10; ++ini) free(L[ini]); free(L); }