适用于数组元素范围确定
数组中尽量有重复元素的情况
原理为申请一个辅助数组,里面存放当前数组中元素的计数。
遍历原数组,相同元素计数++
void CountSort(int* arr,int nlength)
{
int max = 0;
int min = 0;
//找到最大值和最小值
for(int i=0;i<nlength;i++)
{
if(arr[i] > max)
max = arr[i];
if(arr[i] < min)
min = arr[i];
}
//申请计数数组
int* ptemp = (int*)malloc(sizeof(int)*(max-min+1));
memset(ptemp,0,sizeof(int)*(max-min+1));
//遍历原数组,给计数数组赋值
for(int i=0;i<nlength;i++)
ptemp[arr[i]-min]++;
int j = 0;
//遍历计数数组,重新排序原数组
for(int i=0;i<max-min+1;i++)
{
while(ptemp[i])
{
arr[j] = i+min;
j++;
ptemp[i]--;
}
}
free(ptemp);
ptemp = NULL;
}