1,计数排序
计数排序是特殊的排序,这种排序不需要进行元素比较,对于计数排序而言,该排序算法是利用数组下标来确定元素的位置的。
-
让我们来看一个例子
假设数组中有20个随机整数,取值范围是0-10,要求利用最快速度把20个数进行从小到大排序。
如何给这些无序的数组排序呢?
考虑到这些数只能够在1,2,3,4,5,6,7,8,9,10这11个数中取值,可以根据此,建立一个长度为11的数组。数组的下标从0到10,元素初始值全部是0。
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
假设20个随机数如下所示
9,3,5,4,9,1,2,7,8,1,3,6,5,3,4,0,10,9,7,9
下面就开始遍历这个无序的随机数列,每一个整数按照其值对号入座,同时,对应数组下标的元素进行加一操作
例第一个数是9,那么数组下标为9的元素加1
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
第二个数是3,则数组下标是3的元素加一
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
继续遍历数列并修改数组。。。。进行完之后状态如下:
1 | 2 | 1 | 3 | 2 | 2 | 1 | 2 | 1 | 4 |
有了统计结果之后,排序就是直接遍历数组,输出数组元素的下标值,元素的值是几,就输出几次。
代码如下所示:
void count_Sort(int *a,int length){
int max=a[0];
//找出其中最大的数,为了设定统计数组的大小
for(int i=1;i<length;i++){
if(max<a[i]){
max=a[i];
}
}
//进行统计计数
int counta[max+1]={0};
int counta_length=sizeof(counta)/sizeof(int);
for(int i=0;i<length;i++){
counta[a[i]]++;
}
//进行输出
int index=0;
for(int i=0;