#include <iostream>
using namespace std;
void countingSort(const int a[], int la, int b[], int k)
// a:源数据,la:a的大小,b:排序后数据,k:每个数据的上限
{
k++; // 数组下标最大为k,则数组有k+1个元素
int c[k]; // gcc可以,VS不支持可变大小数组
for(int i=0; i<k; i++) c[i]=0;
for(int i=0; i<la; i++) c[a[i]]++; // 计数
for(int i=0; i<k-1; i++) c[i+1] += c[i]; // 调整为<=i的数值的个数
for(int i=la-1; i>=0; i--) // 从后向前输出(为了稳定性)
{
b[c[a[i]]-1] = a[i];
c[a[i]]--;
}
}
int main()
{
int a[8] = {2, 5, 3, 0, 2, 3, 0, 3};
int b[8];
countingSort(a, 8, b, 5);
for(int i=0; i<8; i++)
{
cout << b[i] << " ";
}
cout << endl;
return 0;
}