1 COUNTING-SORT2(A,k) 2 let C[0..k] be a new array 3 for i = 0 to k 4 C[i]=0 5 for i = 1 to A.length 6 C[A[i]] = C[A[i]]+1 7 for i = 1 to k 8 C[i] = C[i] + C[i-1] 9 for i = A.length downto 1 10 while i < (j = C[A[i]) 11 exchagnge A[i] with A[j] 12 C[A[j]] = C[A[j]]-1
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#include <memory.h>
void radix2(int* arr, int len, int k)
{
k++;
int* count_arr = (int*)malloc(sizeof(int)*k);
for(int i = 0; i < k; i++)
{
count_arr[i] = 0;
}
for (int i = 0; i < len; i++)
{
count_arr[arr[i]]++;
}
for (int i = 1; i < k; i++)
{
count_arr[i] += count_arr[i-1];
}
for (int i = len-1; i >= 0; i--)
{
//a[i+1 ... len-1]的元素是已经确定最终位置的元素
//求出arr[i]中元素的最终位置为j,如果i<j,则swap(a[i],a[j]),
//继续寻找新arr[i]元素的最终位置,直到i>=j
int j = count_arr[arr[i]] - 1;
while (i < (j = count_arr[arr[i]] - 1))
{
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
count_arr[arr[j]]--;
}
}
free(count_arr);
}
int rand_int(int max)
{
return (rand() % max);
}
void main()
{
int a[100] = {0};
int max = 20;
srand(time(0));
for (int i = 0; i < 100; i++)
{
a[i] = rand_int(max);
}
radix2(a, 100, max);
for (int i = 0; i < 100; i++)
{
printf("%d ", a[i]);
}
getchar();
}