//-------------------------------------------------------------------------------------------函数申明
#pragma once
//A待排序数组、iLength数组长度,iMax数组的最大值
void CountingSort(int A[], int iLength, int iMax);
//-------------------------------------------------------------------------------------------函数申明
//-------------------------------------------------------------------------------------------函数实现
#include "CountingSort.h"
#include <iostream>
#include <string>
using namespace std;
void CountingSort(int A[], int iLength, int iMax)
{
//用于统计的数组和用于存储排序结果的数组
int* pCount = new int[iMax];
int* pB = new int[iLength];
memset(pCount, 0, sizeof(int) * iMax);
memset(pB, 0, sizeof(int) * iLength);
//某个数出现一次,则计数它的数组相应增加一。
for ( int i = 0; i < iLength; i++)
{
int iValue = A[i];
pCount[iValue] += 1;
}
//pCount[i]中包含了小于等于i的元素个数。
for ( int i = 1; i < iMax; i++)
{
pCount[i] += pCount[i - 1];
}
for (int i = iLength - 1; i >= 0; i--)
{
int iValue = A[i];//值
int iIndex = pCount[iValue];//该值在序列中排多少号。
pB[iIndex - 1] = A[i];
pCount[iValue] = pCount[iValue] - 1;
}
memcpy(A, pB, sizeof(int) * iLength);
delete[] pB;
delete[] pCount;
}
//-------------------------------------------------------------------------------------------函数实现
//-------------------------------------------------------------------------------------------测试程序
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "CountingSort.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
srand(int(time(NULL)));
int A[20];
int iNow = 0;
for ( int i = 0; i < 20;i++ )
{
int iValue = ((int)rand())%1000;
A[i] = iValue;
cout << A[i] << ",";
}
cout << " After Sort :"<<endl;
CountingSort(A, 20, 1000);
for ( int i = 0; i < 20; i++)
{
cout << A[i] << ",";
}
return 0;
}