计数排序
时间复杂度:O(max(n,范围))
空间复杂度:O(范围)
稳定:一般教材认为是稳定的
数据敏感:不敏感
计数排序: 只适合小范围数据, 如果范围大,空间复杂度较高
void countSort(int* array, int n)
{
// 1, 2, 3, 1000000
//统计范围
int min = array[0], max = array[0];
for (int i = 1; i < n; ++i)
{
if (array[i] > max)
max = array[i];
if (array[i] < min)
min = array[i];
}
int range = max - min + 1;
//开辅助空间,进行计数
int* countArr = (int*)malloc(sizeof(int)* range);
//初始化为0
memset(countArr, 0, sizeof(int)* range);
//统计次数
for (int i = 0; i < n; ++i)
{
countArr[array[i] - min]++;
}
//恢复数据, 遍历计数数组
int idx = 0;
for (int i = 0; i < range; ++i)
{
while (countArr[i]--)
{
array[idx++] = i + min;
}
}
free(countArr);
}