使用一个新的数组,数组大小为待排数组最大值减去最小值加1
存储数组最小值到最大值出现的次数
arr = 5 5 3 2 7 9 6 9 2 7 7
max - min +1 = 8
使用大小为8 的数组
max = 9 min = 2
数组内容 2 1 0 2 1 3 0 2
(对应值出现次数)
数组下标 0 1 2 3 4 5 6 7
对应的存储值 2 3 4 5 6 7 8 9
arr[i] - min 就是数组内容存储值对应的下标 arr[2] - 2 = 1 3对应的下标为1
i + min 存储的值 0+ 2 = 2 1+2 =3
#include<iostream>
#include<cstring>
using namespace std;
void CountSort(int arr[], int len)
{
int max = arr[0];
int min = arr[0];
for (int i = 1; i < len; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
if (arr[i] < min)
{
min = arr[i];
}
}
int countLen = max - min + 1;
int* countArr = new int[countLen];
memset(countArr,0,sizeof(int) * countLen);// 置0
for (int i = 0; i < len; i++)
{
// 计数
countArr[arr[i] - min]++;
}
int index = 0;
// 按序拷贝到原来的数组
for (int i = 0; i < countLen; i++)
{
while (countArr[i] > 0)
{
arr[index++] = i + min;
countArr[i]--;
}
}
delete[] countArr;
}
void PrintfArr(int arr[],int len)
{
for (int i = 0; i < len; i++)
{
printf("%d\t",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {5,4,6,12,21,4,5,6,8,5,3,14,21};
int len = sizeof(arr) / sizeof(arr[0]);
PrintfArr(arr, len);
CountSort(arr, len);
PrintfArr(arr, len);
return 0;
}