计数排序的核心思想是:
1 以待排序的数作为count序列的下标,以该下标出现的次数作为值。
2 线性的检测count序列的不为0的项,将此项的值 放在result序列的当前index下标项中,count序列中该计数减一。
代码实现如下:
int GetMaxValue(int* array,int length)
{
int maxValue = array[0];
for(int i =1;i < length;i++)
{
if(maxValue < array[i])
{
maxValue = array[i];
}
}
return maxValue;
}
int GetMinValue(int* array,int length)
{
int minValue = array[0];
for(int i =1;i < length;i++)
{
if(minValue > array[i])
{
minValue = array[i];
}
}
return minValue;
}
void CountSoft(int* array,int length)
{
int maxValue = GetMaxValue(array,length);
int minValue = GetMinValue(array,length);
int* count = new int[maxValue + 1];
memset(count,0,sizeof(int) * (maxValue + 1));
for(int i = 0;i < length;i++)
{
//计数
++count[array[i]];
}
int index = 0;
for(int i = minValue;i < maxValue + 1;i++)
{
for (int j = count[i];j > 0;j--)
{
array[index++] = i;
}
}
delete[] count;
}
int main() {
int array[] = {12,31,1,21,11,3,89,56,14,89,10};
int length = sizeof(array) / sizeof(array[0]);
CountSoft(array,length);
std::for_each(array,array+length,[](int i){
std:: cout << i << " ";
});
std::cout << std::endl;
cout << "test\n";
return 0;
}
计数排序使用了一个技巧 就是利用 count 以array[i] 做下标,这样就造成了自然有序。
计数排序的时间复杂度为:O(n+k) n为数组的长度,k为数组的范围大小 k = maxValue - minValue
计数排序的时间复杂度主要取决于 k(范围),范围越大,排序效率越低。
计数排序适合于范围幅度较小的序列排序。