思想
计数排序的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数(此处并非比较各元素的大小,而是通过对元素值的计数和计数值的累加来确定)。一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。
计数排序对输入的数据有附加的限制条件:
1、输入的线性表的元素属于有限偏序集S;
2、设输入的线性表的长度为n,|S|=k(表示集合S中元素的总数目为k),则k=O(n)。
在这两个条件下,计数排序的复杂性为O(n)
代码:
#pragma once
//在范围中排序
void CountSortBetMaxAndMin(int *a, int min, int max,int size)
{
int gap = max - min + 1;
int *temparray = new int[gap];
memset(temparray,0,sizeof(int)*(gap+1));
for (int count = 0; count < size; ++count)
{
temparray[a[count]]++;
}
//temparray是一个
int index = 0;
for (int i = min; i < size; ++i)
{
while (temparray[i] != 0)
{
a[index++] = i;
temparray[i]--;
}
}
}
//计数排序
void CountSort(int *a,int size)
{
//找一个范围 即就是数组的元素的最大和最小值
int max = a[0]; //最大
int min = a[0]; //最小
for (int i = 1; i < size; ++i)
{
if (a[i] > max)
{
max = a[i];
}
else if (a[i] < min)
{
min = a[i];
}
}
//在这个范围中计数排序
CountSortBetMaxAndMin(a, min, max,size);
}