基本原理:根据统计待排序数组中某个数大于等于其他数的个数来确定排序后所在的位置计数排序是一种非常快捷的稳定性强的排序方法,时间复杂度O(n+k),其中n为要排序的数的个数,k为要排序的数的组大值。计数排序对一定量的整数排序时候的速度非常快,一般快于其他排序算法。但计数排序局限性比较大,只限于对整数进行排序。消耗空间复杂度来获取快捷的排序方法,其空间复杂度为O(K),K为要排序的最大值。
1.首先找出待排序数组的最大值,用来创建临时空间,该临时空间的大小就是最大值+1;该临时空间用来存放每个数出现的次数。
2. temp数组大小为9,下标范围为0-max,对于索引8来说,8在待排序数组中出现了1次,即temp[8]=1;对于索引6来说,6在在待排序数组中出现了2次,即temp[6]=2;以此类推。
3. 对所有的计数进行累加,即对于第i个位置,统计小于等于i的所有个数,重新覆写到temp数组中,对于索引3来说,小于等于3的总个数为2。对于索引7来说,小于等于7的总个数为7。
4.反向填充目标数组:根据待排序数组中的元素值放在统计的个数值-1处,即对于待排序数8来说,首先找到temp的索引为8处,该统计的个数减去一,为7,即8放在排序结果数组的索引7处。即对于待排序数5来说,首先找到temp的索引为5处,该统计的个数减去一,为3,即5放在排序结果数组的索引3处。即对于待排序数6来说,首先找到temp的索引为6处,该统计的个数减去一,为5,即6放在排序结果数组的索引5处。对于第二个6来说,因为前面统计个数为5,这里减一为4,即第二个6放在排序结果数组的索引4处。
代码:
//计数排序
void Counting_Sort(int list[], int n)
{
int max = 0;
//找出待排序的数组中最大值
for (int i = 0; i < n; i++)
{
if (list[i] > max)
{
max = list[i];
}
}
//创建的临时数组大小比最大值大1,该数组用来对原数组的值统计个数,范围0-max,共max+1个
int *temp = new int[max + 1];
//初始化为0
memset(temp, 0, sizeof(int)*(max + 1));
//对每个数字统计个数,下标代表原数组中的数
for (int i = 0; i < n; i++)
{
temp[list[i]]++;
}
//统计对于i值来说小于等于i值的个数,对于原数组来说统计小于当前值的所有个数
for (int i = 1; i < max + 1; i++)
{
temp[i] = temp[i] + temp[i - 1];
}
//存放排序结果
int *res = new int[n];
for (int i = 0; i < n; i++)
{
temp[list[i]]--;//统计的个数减一
res[temp[list[i]]] = list[i];//放在统计的个数的位置处
}
for (int i = 0; i < n; i++)
{
list[i] = res[i];
}
delete[] temp;
delete[] res;
}
时间复杂度为,k为要排序的数组范围即最大值。空间复杂度:,稳定性:稳定