算法思想
计数排序是一种特殊情况下的一种排序:量大但是范围小
比如:如何快速得知高考名次
计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
算法描述
找出待排序的数组中最大和最小的元素;
统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。
代码实现
C++
#include <iostream>
using namespace std;
void countingSort(int* arr, int len)
{
int max = arr[0];
int min = arr[0];
for(int i = 1;i<len;++i)
{
if(max < arr[i])
max = arr[i];
if(min > arr[i])
min = arr[i];
}
int range = max - min + 1;
int* count = new int[range];
for(int i = 0;i<len;++i)
{
++count[arr[i] - min];
}
int index = 0;
for(int i = 0;i<range;++i)
{
while(count[i]--)
arr[index++] = i + min;
}
delete[] count;
}
int main()
{
int arr[] = {1,1,3,3,2,2,4,4,3,3,5,3,2,1,2,4,5,3};
int len = sizeof(arr) / sizeof(arr[0]);
countingSort(arr, len);
for(int i = 0; i<len;++i)
cout<<arr[i]<<endl;
return 0;
}