记数排序思路:
首先遍历一遍,找到最大和最小的数,利用最大和最小开辟空间,记为tmp.然后统计各个数字出现的次数,利用出现的次数,遍历tmp,根据出现的次数,重新写入数组a中
</pre><pre name="code" class="cpp">//计数排序
void CountSort(int* a, int size)
{
assert(a);
int max = a[0];
int min = a[0];
for (int i = 0; i < size; i++) //利用最大和最小开辟空间
{
if (a[i]>max)
{
max = a[i];
}
if (a[i] < min)
{
min = a[i];
}
}
int* tmp = new int[max - min + 1];//ex:0到8--要开9个空间
memset(tmp, 0, sizeof(int)*(max - min + 1)); //记得初始化,不然计数会出现一堆随机值
for (int i = 0; i < size; i++)
{
++tmp[a[i]-min];
}
int j = 0;
for (int i = 0; i < size; i++)
{
while (tmp[i]>0)
{
a[j++] = i+min;
tmp[i]--;
}
}
}
void Print(int *arr, int size)
{
for (int i = 0; i < size; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void TestCountSort()
{
//int array[] = { 10, 12, 11, 10 ,19};
int array[] = { 10, 11, 13, 12, 19, 16, 18, 15, 17, 14 };
CountSort(array, sizeof(array) / sizeof(array[0]));
Print(array, sizeof(array) / sizeof(array[0]));
}