#include<iostream>
using namespace std;
/*
| 参数说明:输入数组in[], 输出数组out[], 输入数组长度,输入数组中的最大值。
|
|数组count[]为计数数组,记录输入数组in中重复出现的元素的个数
*/
void count_sort(int in[], int out[], int size, int max_value)
{
int* count = new int [max_value];
//把计数数组每一位都赋值为0
for (int i = 0; i <= max_value ; i++ )
count[i] = 0;
/*依次取出数组in中的值,并把值作为数组count的下标,
|且计数数组in中重复出现的值的个数,并把此计数值作为数组count的取值
*/
for (int i = 0; i < size; i++)
count[in[i]] = count[in[i]] + 1;
/*count[max_value]中记录的是数组in[size]中每一个元素出现的次数
|当累加每个元素出现的次数时,相应的就能计算出对应的在数组out[size]中的位置
|比如在in[]中有15个元素比in[POS]处的值小时,则in[POS]就可以放在out[POS]处。
|
|参数max_value表示数组in中最大的值,该值作为数组count的上界count[0 -> max_value],
|
|假设value()是取值函数,pos()是取位置函数,repeat_num()是数组内重复元素出现的次数
|那么数组in和数组count就有这样的对应关系:
|
|value( in ) == pos( count ) ,repeat_num( in ) == value( count )
|
|简述:以0 --> size从数组in中取值,以此值作为数组count的下标,并在count记录
|数组in中重复值出现的次数。
*/
for (int i = 1; i <= max_value; i++)
count[i] = count[i] + count[i-1];
for ( int i = size - 1; i >= 0; i-- )
{
out[ count[ in[i] ] -1] = in[i];
count[in[i]] = count[in[i]] - 1;
}
delete [] count;
}
int main()
{
int sur[] = {10,9,6,9,10,3,5,6,3,1};
int len = sizeof(sur)/sizeof(int);
int* des = new int [len];
int max_k = 10;
count_sort(sur, des, len, max_k);
for ( int z = 0; z < len; z++)
cout << des[z] << " ";
delete [] des;
cin.get();
return 0;
}
计数排序
最新推荐文章于 2024-11-16 14:38:00 发布