基本思想
将序列中各元素转换为键存储在额外开辟的数组空间中。做为一种线性时间复杂度的排序算法,计数排序要求输入的数据必须是有确定范围的整数。
算法步骤
- 找出待排序序列arr中最大元素max和最小元素min;
- 定义计数数组countArr,大小为max-min+1;
- 统计待排序序列中每个元素i的出现次数,存入到数组countArr的i-min项;
- 遍历计数数组countArr,依次将索引index+min赋值到arr中。
代码示例
java
public class CountingSort {
public static void main(String[] args) {
int[] a = new int[] {7,5,1,3,9,3,4,8,0};
coutingSort(a);
for(int num : a) {
System.out.println(num);
}
}
public static void coutingSort(int[] arr) {
//define a counting array
int max, min;
max = min = arr[0];
for(int num: arr) {
if(max < num) max = num;
if(min > num) min = num;
}
int countArr[] = new int[max - min + 1];
//Counting each value of arr
for(int i = 0; i < arr.length; i++) {
countArr[arr[i] - min] += 1;
}
//get the ordered array
int index = 0;
for(int i = 0; i < countArr.length; i++) {
while(countArr[i]-- > 0) {
arr[index++] = i + min;
}
}
}
}