void CountingSort(int *A, int *B, int n, int k) { int *C = (int *)malloc((k + 1) * sizeof(int)); if (!C) { printf("C malloc error!\n"); return ; } // 初始化数组C for (int i = 0; i <= k; i++) C[i] = 0; // 记录每个元素的个数 for (int j = 0; j < n; j++) C[A[j]]++; // 累计计数 for (int i = 1; i <= k; i++) C[i] = C[i] + C[i-1]; // 将A中元素映射到B中 for (int j = n - 1; j >= 0; j--) { B[C[A[j]]-1] = A[j]; C[A[j]] = C[A[j]] - 1; } free(C); }
void StableSort(int *A, int size, int radix, int d) // digit
{
int *C = (int *)malloc(radix * sizeof(int));
if (!C) {
printf("C malloc error\n");
return ;
}
int *B = (int *)malloc(size * sizeof(int));
if (!B) {
printf("B malloc error\n");
return ;
}
int *D = (int *)malloc(size * sizeof(int));
if (!D) {
printf("D malloc error\n");
return ;
}
// 初始化数组C
for (int i = 0; i < radix; i++)
C[i] = 0;
int val = 1;
while (--d)
val *= 10;
// 记录每个元素的个数
for (int j = 0; j < size; j++) {
D[j] = A[j] / val % 10;
C[D[j]]++;
}
// 累计计数
for (int i = 1; i < radix; i++)
C[i] = C[i] + C[i-1];
// 将A中元素映射到B中
for (int j = size - 1; j >= 0; j--) {
B[C[D[j]]-1] = A[j];
C[D[j]]--;
}
for (int i = 0; i < size; i++)
A[i] = B[i];
free(C);
free(B);
free(D);
}
void RadixSort(int *A, int size, int radix, int d)
{
for (int i = 1; i <= d; i++) {
StableSort(A, size, radix, i);
}
}