排序算法--计数排序(java)
1、计数排序的思路:对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。然后根据这个数将x直接存放到最终的输出序列的正确位置上。
2、算法思路
设需要排序的序列 a=[43,37,42,44,38,42,44]
首先找出序列a中的最大值max和最小值min,对其做差记为k;
定义数组c[k+1](下标0--k分别表示与a序列中最小值的差值),初始值为0,最终是用来表示比a[i]小的元素的个数。
(1)为数组c赋值,计算a中各元素出现的次数:对a中序列循环,c[a[i]-min]=c[a[i]-min]+1(此时c={1,1,0,0,0,2,1,2})
(2)再次计算数组c,让其表示序列中元素小于自己的个数:从1开始循环c, c[i]=c[i]+c[i-1](此时c={1,2,2,2,2,4,5,7})
(3)定义与数组a等长的素组b,b[--c[a[i]-min] = a[i],此时数组b为新排序好的数组。
3.算法的java代码
public static int[] countSort(int[] a){
int len = a.length;
int[] b = new int[len];
int max = a[0];
int min = a[0];
for(int data:a){
if(data > max){
max = data;
}else if(data < min){ //此处用了个else是因为本人认为一个数不可能比max大的同时还比min小,如果有问题,欢迎指出
min = data;
}
}
int k = max - min +1;
int[] c = new int[k];
for(int i = 0; i < len; i++){
c[a[i]-min]+=1;
}
for(int i = 1; i < k; i++){
c[i] = c[i]+c[i-1];
}
for(int i = 0; i < len; i++){
b[--c[a[i]-min]] = a[i];
}
return b;
}