#include <iostream>
#include <cmath>
#include <algorithm>
#include "memory.h"
#include <cstdio>
#include <stack>
#include <iterator>
#include <utility>
#include <cassert>
#include <exception>
#include <vector>
#include <typeinfo>
using namespace std;
void SortBaseNum_InPlace(int a[],int n,int maxNum)
{
int *pPos = new int[maxNum + 1];
int *pCount = new int[maxNum + 1];
assert(pPos != NULL && pCount != NULL);
memset(pCount,0,sizeof(int)*(maxNum + 1));
for (int i = 0; i < n; i++)
pCount[a[i]]++;
pPos[0] = pCount[0] - 1;
for (int i = 1; i <= maxNum; i++)
pPos[i] = pPos[i - 1] + pCount[i];
int index = 0;
while (1)
{
while (index <= maxNum && pCount[index] == 0)
index++;
if (index > maxNum)
break;
int srcPos = pPos[index];
int curValue = a[srcPos];
int desPos = pPos[curValue];
while (srcPos != desPos)
{
pCount[curValue]--;
pPos[curValue]--;
int t = a[desPos];
a[desPos] = curValue;
curValue = t;
desPos = pPos[curValue];
}
pCount[curValue]--;
pPos[curValue]--;
a[desPos] = curValue;
}
delete[] pPos;
delete[] pCount;
}
int main()
{
int a[10] = {12,12,2,11,2,1,3,12,0,8};
SortBaseNum_InPlace(a,10,12);
for (int i = 0; i < 10; i++)
cout<<a[i]<<ends;
cout<<endl;
return 0;
}