package algorithm.sort;
import utils.com.ArrayLister;
/**
* 计数排序 O(n)
*
* 算法的步骤如下: 找出待排序的数组中最大和最小的元素 ,统计数组中每个值为i的元素出现的次数,存入数组C的第i项
* 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加) 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1
*
* @author Toy
*
*/
public class CountSort {
/**
* 假定a元素范围在 0-100
*
* @param a
* @return
*/
public int[] sort_01(int[] a) {
int n = a.length;
int max = ArrayLister.getMax(a);
// int min = ArrayLister.getMin(a);
int[] b=new int[n];
// 默认将所有寄存项都设为计数0
int[] c = new int[max+1] ;
for (int i = 0; i <= max; i++) {
c[i] = 0;
}
// 计数开始
for (int i = 0; i < n; i++) {
c[a[i]] = c[a[i]] + 1;
}
// 叠加数组每项之前的所有次数。就可以推算出他的位置
for(int i=1;i<=max;i++){
c[i]=c[i]+c[i-1];
}
// 根据统计的计数,计算出该项属于的位置 直接放到最终存储数组。
// 并将其计数减一, 以便处理重复元素
for(int i=n-1;i>=0;i--){
b[c[a[i]]-1]=a[i];
c[a[i]]=c[a[i]]-1;
}
return b;
}
/**
* @param args
*/
public static void main(String[] args) {
int[] a=new int[]{5,6,3,3,2,4,7};
CountSort s=new CountSort();
ArrayLister.showArr(a);
a = s.sort_01(a);
ArrayLister.showArr(a);
}
}
计数排序
最新推荐文章于 2020-10-27 06:49:25 发布