通过统计数组中每一个元素出现的次数,然后根据统计的次数进行排序,这样子就能够实现计数排序了,首先找出一个数组中的最大值和最小值,然后创建一个从最小值到最大值的数组,紧接着遍历数组,将数组中的数据,转换成最大值和最小值之间的每一个元素出现的次数,最后将统计数据出现的次数转换成根据统计的次数排序。
它适合于数据大小范围比较集中的数组。
但是如果数组中的数值很大的时候,就需要开辟很多空间,这就造成了空间浪费,为了避免空间浪费,需要采用相对映射的方法
二.代码实现// 计数排序
void CountSort(int* a, int n)
{
int min = a[0], max = a[0];//找出最小值和最大值
for (int i = 1; i < n; i++)
{
if (a[i] > max)
{
max = a[i];
}
if (a[i] < min)
{
min = a[i];
}
}
int range = max - min + 1;//这是计数数组的大小
int* temp = (int*)malloc(sizeof(int) * range);//创建计数数组
memset(temp, 0, sizeof(int) * range);
for (int i = 0; i < n; i++)
{
temp[a[i] - min]++;//a[i] - min相对位置存数组顺序信息
}
int j = 0;
for (int i = 0; i < range; i++)
{
while (temp[i]--)
{
a[j] = i + min;//恢复
j++;
}
}
}
三.复杂度
由于统计数据出现的次数以及 找出最大值最小值的时间复杂度为O(N),然后根据统计的次数排序的时间复杂度是O(range),所以总的时间复杂度为O(max(N,range))。
由于在堆上创建了长度为range的数组,所以空间复杂度为O(range)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)