计数排序需要建立一个表,这个表用来计数,统计每个数字出现的次数,这个表的长度为最大值和最小值的差+1,当最大值和最小值的差比较大时,建立的表也会非常大,非常消耗内存。建表结束后,再一次从表中取出数据,则可完成排序。
例如:
12 6 8 11 10
在上面的序列中,最大值为12,最小值为6,那么需要建立一个长度为7的表进行计数。
参考代码:
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
const int c_n = 10;
//遍历要排序的序列
//找到其中最大元素和最小元素,开辟一个新数组,区间为最大值和最小值的差
//利用这个数组的记录序列出现的数字的次数
void countsort(int *a)
{
int max = a[0];
int min = a[0];
for (int i = 0; i < c_n; i++) //找到最大最小值
{
if (a[i] > max)
max = a[i];
if (a[i] < min)
min = a[i];
}
int *count = new int[max-min+1];
memset(count, 0, sizeof(int)*(max - min + 1));//初始化
for (int i = 0; i < c_n; i++)
{
count[a[i]-min]++; //计数
}
int i = 0;
for (int j = 0; j <= max - min; j++)
{
while (count[j] != 0)
{
a[i++] = j+min;
count[j]--;
}
}
delete []count;
}
void main()
{
srand(time(NULL));
int a[c_n];
for (int i = 0; i < c_n;i++)
{
a[i] = rand() % 20;
}
countsort(a);
for (int i = 0; i < c_n; i++)
cout << a[i] << " ";
cout << "\n";
system("pause");
}