计数排序是线性排序,是基数排序的一种。
主要先上代码和输出,可以看一下。
import java.util.Arrays;
public class CountSort {
public static void main(String[] args) {
int[] arr = {2,4,2,3,7,1,1,0,0,5,6,9,8,5,7,4,0,9};
System.out.println("原数组 arr:");
System.out.println(Arrays.toString(arr));
int[] result = sort(arr);
System.out.println("排序后数组 result:");
System.out.println(Arrays.toString(result));
}
private static int[] sort(int[] arr) {
int[] result = new int[arr.length];
int[] count = new int[10];
for (int i = 0; i < arr.length; i++) {
count[arr[i]]++;
}
System.out.println("计数数组 count:");
System.out.println(Arrays.toString(count));
for (int i = 0,j=0; i < count.length;i++) {
while(count[i]-- > 0) result[j++] = i;
}
// for (int i = 1; i < count.length; i++) {
// count[i] = count[i-1] + count[i];
// }
// System.out.println("累加数组 count:");
// System.out.println(Arrays.toString(count));
// for (int i = arr.length-1;i>=0;i--) {
// result[--count[arr[i]]] = arr[i];
// }
return result;
}
}
输出:
原数组 arr:
[2, 4, 2, 3, 7, 1, 1, 0, 0, 5, 6, 9, 8, 5, 7, 4, 0, 9]
计数数组 count:
[3, 2, 2, 1, 2, 2, 1, 2, 1, 2]
排序后数组 result:
[0, 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 9, 9]
计数数组下标处对应的值为下标数字的次数。即i = count[arr[i]]。
但这样同时也容易带来一个问题,就是这样的计数排序是不稳定的。即如果我有两个数a,b,a与b数值是相等的,且在原数组中a在b前的,但在排序只后,就有可能出现a在b之后的情况。
如果这么说还明确这种不稳定性不便之处的话,可以想象是对象的话,排序出现这种情况会带来什么影响。排序的根据主要是比较对象的某一个属性,如果说两个属性值相同而其他的属性值不同的话,如果是这种不稳定的排序,则会导致两个对象相对的顺序被打乱。再或者是订单信息,初始是以时间顺序写入的,当你想以价格高低来排序的话,你肯定想能相同价格时,时间的先后顺序也是整齐的。如果排序是不稳定的,则会出现价格相同时,下单时间信息顺序错乱。
所以如果想以一种方法或者设计保证排序的稳定性时,可以用累加数组,将数组从后向前扫面,一一放入排序数组。
片段如下:
for (int i = 1; i < count.length; i++) {
count[i] = count[i-1] + count[i];
}
for (int i = arr.length-1;i>=0;i--) {
result[--count[arr[i]]] = arr[i];
}
输出:
原数组 arr:
[2, 4, 2, 3, 7, 1, 1, 0, 0, 5, 6, 9, 8, 5, 7, 4, 0, 9]
计数数组 count:
[3, 2, 2, 1, 2, 2, 1, 2, 1, 2]
累加数组 count:
[3, 5, 7, 8, 10, 12, 13, 15, 16, 18]
排序后数组 result:
[0, 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 9, 9]
217

被折叠的 条评论
为什么被折叠?



