之前大多复习的是比较排序,意思就是数与数进行比较根据结果来排序,这种排序方法在目前看来最快也就是O(nlogn)这种速度了,那么更快的一种方法便是计数排序,不用比较直接数数的排序方法,虽然原始,而且可能会耗费大量的空间,但是它只用遍历一遍数组O(n),可谓十分的快。
计数排序
1.明确已知条件
我们必须知道需要排序数组的元素数量(size),以及该数组的上下限(max_num,min_num)
2.建立一个新数组
这个新数组的大小就是[max_num-min_num],这样的话数组的下标(i)加上min_num就可以代表原数组里的每一个数了。
3.遍历原数组并操作新数组
如果原数组中存在一个数x,那么就在新数组[x-min_num]的位置上加一,这样就可以统计出原数组中每个数的个数。
4.赋值回原数组
用新数组的下标值加上min_num之后赋回给原数组即可,如果新数组下标位置的数为0则视为原数组无此数或已经将此数赋完,那么将新数组下标加一。
代码:
#include <iostream>
#include <cmath>
using namespace std;
void countnum_sort(int a[],int min_num , int max_num,int size)
{
int *temp = new int[max_num-min_num]; //创建临时数组
int k =0; //新数组下标k
for(int j = 0 ; j < max_num-min_num ;j++) //新数组置0
{
temp[j]=0;
}
for(int i = 0 ; i < size ;i++)
{
temp[a[i]-min_num]++; //给相应位置的新数组的数加一
}
for(int i = 0 ; i < size ;i++)
{
while(1) //一直找到能赋值的下标k
{
if(temp[k])
{
a[i] = k + min_num;
temp[k]--;
break;
}
else
k++;
}
}
}
int main()
{
int a[] = {1,4,5,6,7,3,2,8,9,2,2,2,2};
countnum_sort(a,1,9,sizeof(a)/sizeof(int));
for(int i = 0;i<sizeof(a)/sizeof(int);i++)
{
cout<<a[i];
}
}
得到输出结果: