计数排序法
算法概述:
计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。
计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。
算法过程:
找出待排序的数组中最大和最小的元素;
统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。
时间复杂度:
最佳情况:T(n) = O(n+k) 最差情况:T(n) = O(n+k) 平均情况:T(n) = O(n+k)
代码:
public class Test16 {
public static void main(String[] args) {
int[] array = {13,1,2,10,8,12,4,4,1,1,1,1,12,13};
//排序
sort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
}
public static void sort(int[] array){
//获取数组最大的数和最小的数
int min = array[0];
int max = array[0];
for (int i = 0; i < array.length; i++) {
if (array[i]<min) {
min =array[i];
}
if (array[i]>max) {
max = array[i];
}
}
//根据最大值和最小值初始化一个临时数组
int[] temparray = new int[max-min+1];
Arrays.fill(temparray, 0);
//将目标数组中元素的大小和临时数组的下标进行比较,将对应的计数+1
for (int i = 0; i < array.length; i++) {
temparray[array[i]-1]++;
}
//根据临时数组下标和对应的计数大小对目标数组进行重新赋值
int j = 0;
for (int i = 0; i < temparray.length; i++) {
while(temparray[i]>0){
array[j++] = min+i;
temparray[i]--;
}
}
}
}