#include <iostream>
using namespace std;
void CountingSort(int*A, int length, int MaxData);
int main ()
{
int arr[] = {3,1,5,2,4,55,3,1,9,8,99,4,99,8,7};
int len = sizeof(arr)/sizeof(arr[0]);
CountingSort(arr, len, 99);
for (int i = 0; i < len; ++i)
{
cout << arr[i] << "\t";
}
cout << endl;
return 0;
}
void CountingSort(int*A, int length, int MaxData)
{
MaxData += 1;
int* pCount = new int[MaxData];
for (int i = 0; i < MaxData; ++i)
{
pCount[i] = 0;
}
for (int i = 0; i < length; ++i)
{
pCount[A[i]] += 1;
}
//pCount[i] 表示每一个数的索引,从前向后叠加,确定了最大值的索引位置,注:索引从1开始
for (int i = 1; i < MaxData; ++i)
{
pCount[i] += pCount[i-1];
}
//把已经排好序的数字加入到临时数组中
int* B = new int[length];
for (int i = length-1; i >= 0; i--)
{
/*从输入数组A的最后开始,A[i]表示值, pCount[A[i]] 表示值A[i]排好序后的索引。
(数组索引从0开始,再减去1)
*/
B[ pCount[ A[i] ] - 1 ] = A[i];
//减少索引计数,下一个相同的A[i] 排在当前A[i]的前边
pCount[ A[i] ] -= 1;
}
for (int i = 0; i < length; ++i)
{
A[i] = B[i];
}
delete B;
B = NULL;
delete pCount;
pCount = NULL;
}
计数排序
最新推荐文章于 2022-01-03 21:18:08 发布