计数排序
思路
- 元素转下标
- 下标转元素
- 下面的源代码不包含对非负数排序的功能
/*
* 非常快,但是有可能浪费大量空间
*/
public class 计数排序 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = { 0, 16, 4, 10, 14, 7, 9, 3, 2, 8, 1, 1 };
countSort(arr, arr.length);
for (int num : arr) {
System.out.print(num + " ");
}
}
public static void countSort(int[] arr, int n) {
int len = 0;
for (int i = 0; i < n; i++) {
if (arr[i] > len) {
len = arr[i];
}
}
int[] helper = new int[len + 1];
for (int i = 0; i < n; i++) {
helper[arr[i]]++;// 元素转下标,同时要考虑到存在相同值的情况
}
int cur = 0;
for (int i = 0; i < helper.length; i++) {
while (helper[i] > 0) {
arr[cur] = i;// 下标转元素
helper[i]--;
cur++;
}
}
}
}