计数排序–非比较排序
首先我们要明白两个概念:
绝对映射
相对映射
我们创建要给count数组,统计出Arr数组每个数出现的次数
A[ i ] 的值为多少,就给count对应位置进行操作:count[ A [ i ]]++
此时两数组的对应关系叫做 绝对映射。
再来看一种情况
如果绝对映射的方法创建数组,那么 0-9 个空间就浪费了,所以我们采用相对映射。0代表10,1代表11,2代表12,即为 min+i 则可还原为原数据。
完整的代码
void CountSort(int* a, int n)
{
int max = a[0], min = a[0];
for (int i = 0; i < n; i++)
{
if (a[i]>max)
max = a[i];
if (a[i < min])
min = a[i];
}
int range = max - min + 1;
int * count = (int*)malloc(sizeof(int)*range);
memset(count, 0, sizeof(int)*range);
for (int i = 0; i < n; i++)
{
count[a[i] - min]++;
}
int i = 0;
for (int j = 0; j < range; ++j)
{
while (count[j]--)
{
a[i++] = j + min;
}
}
free(count);
}