计数排序
一、计数排序算法的原理
计数排序是一种非比较排序的方法,适用于量大但是范围小的数组当中,其思想为记录一个数在数组中出现的个数,出现一次,就+1,如果没有出现就是0,最后最后直接遍历输出这个数组里面的每一个大于0的元素值即可。
下面展示一些 计数排序代码片
。
//计数排序法
package arraylist;
import java.util.Arrays;
public class CountSort {
public static void main(String[] args) {
int[] array = new int[]{9,5,9,4,1,8,9,0,9,3,1,2};
int[] sortedArray = countSort(array);
System.out.println(Arrays.toString(sortedArray));
}
public static int[] countSort(int[] array) {
//1.得到数列的最大值,并计算出差值d
int max = array[0];
int min = array[0];
for (int i = 0; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
if (array[i] < min) {
min = array[i];
}
}
int d = max - min;
//2.创建统计数组并对统计对应元素的个数。
int[] countArray = new int[d + 1];
for (int i = 0; i < array.length; i++) {
countArray[array[i] - min]++;
}
//3.统计数组做变形,后面的元素等于前面的元素之和
for (int i = 1; i < countArray.length; i++) {
countArray[i] += countArray[i - 1];
}
//4.倒序遍历原始数列,从统计数组找到正确位置,输出到结果数组
int[] sortedArray = new int[array.length];
for (int i = array.length - 1; i >= 0; i--) {
sortedArray[countArray[array[i] - min] - 1] = array[i];
countArray[array[i] - min]--;
}
return sortedArray;
}
}
计数排序的时间复杂度为O(n+k),空间复杂度为O(n+k),算法是稳定的。