计数排序(鸽巢原理):
1、算法描述:
找到待排序列中最大最小的元素,然后以此确定临时空间的大小,在临时空间中,以待排序列组中元素的大小为下标,该元素出现的次数为该下标对应的元素,根据临时空间的统计结果,重新对元素进行回收.
2、动态图描述:
3、代码实现(C++):
#include<iostream>
#include<assert.h>
using namespace std;
int GetMaxValue(int *arr, int size){
int i = 0;
int max = arr[0];
for (i = 1; i < size; i++)
{
if (arr[i]>max)
max = arr[i];
}
return max;
}
int GetMinValue(int *arr, int size){
int i = 0;
int min = arr[0];
for (i = 1; i < size; i++)
{
if (arr[i]<min)
min = arr[i];
}
return min;
}
void _Count_Sort(int *arr, int *temp, int size, int ret, int min){
int i = 0;
int index = 0;
//统计个数
for (i = 0; i < size; i++)
{
temp[arr[i] - min]++;
}
//回收,把temp里的数据回收到原空间里
for (i = 0; i <ret; i++)
{
while (temp[i]--)
{
arr[index++] = i + min;
}
}
free(temp);
}
void Count_Sort(int *arr, int size){
int max = GetMaxValue(arr, size);
int min = GetMinValue(arr, size);
int ret = max - min + 1;
int *temp = (int *)malloc(ret*sizeof(arr[0]));
if (temp == NULL)
{
assert(0);
return;
}
//memset作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
memset(temp, 0, ret*sizeof(int));
_Count_Sort(arr, temp, size, ret, min);
}
int main(){
int array[] = { 3, 4, -3, 2, 0, 2, 6, -5, 4, 7 };
int size = sizeof(array) / sizeof(array[0]);
Count_Sort(array, size);
for (auto e:array)
{
cout << e << " ";
}
cout << endl;
return 0;
}