对于排序,对于第一次看计数排序代码,则会被数组的嵌套绕晕,最好的方式就是,将数组代入,一步一步执行,便能更好的理解代码。
计数排序的代码为:
package com.dong.counting;
public class Counting {
public static void countSort(int array[],int size,int result[],int K) {
5 int[] temp = new int[K];
int i,j ;
//初始化temp数组
for(i=0;i<K;i++) {
temp[i] = 0;
10 }
//将array[]数组中的元素值对应到temp的下标中,越大的值在temp数组的后面
12 for(j=0;j<size;j++) {
temp[array[j]] = temp[array[j]]+1;
14 }
//统计元素的大小
16 for(i=1;i<K;i++) {
temp[i] = temp[i]+temp[i-1];
18 }
//将结果保存到result[]中
20 for(j=size-1;j>=0;j--) {
result[temp[array[j]]-1]=array[j];
temp[array[j]]=temp[array[j]]-1;
23 }
}
public static void main(String[] args) {
int[] array = {1,6,3,2,9};
int[] result = new int[5];
countSort(array, 5, result, 10);
for(int i=0;i<result.length;i++) {
System.out.println(result[i]);
}
}
}
代码的执行结果为:12369
接下来我将一一解释代码,以便于更好的理解:
⑴首先是5-10行代码,用来对需要的数组做初始化工作:
注意:这里有一个问题,即temp数组的大小问题。temp数组的下标为array数组的值,所以只要temp数组的容量大于array数组的最大值即可。
⑵12-14行代码,实现的是在temp数组中,以array数组的值为temp数组的下标,越靠后的代码其原始值越大,
⑶16-18行代码,用来统计temp中元素的大小,因为这个位置的顺序就代表原始数组的大小顺序,所以可以通过temp数组来统计元素的实际位置
⑷20-23用来根据temp的顺序,将排序好的数按顺序放入result数组中:
result[temp[array[j]]-1]=array[j];
temp[array[j]]=temp[array[j]]-1;
对于这两行代码,需要一步一步解析:
array[j]:即原始数组的第j个值;
temp[array[j]]:即原始数值在数组中的大小顺序;
[temp[array[j]-1]:即因为大小数值是比较的是个数,对于数组来说,下标从0开始,所以-1;
result[temp[array[j]-1]:代表的是需要在result中存储array[j]元素的数组元素;
temp[array[j]] = temp[array[j]]-1:即相当于将已经排序的元素在array数组中去除,temp数组的值为去掉排序过的元素的array数组执行16-18行代码的结果,这行代码也可以注释掉。
计数排序的时间复杂度为O(n),空间复杂度也为O(n);
之所以写这个,是因为计数排序不是通过比较来进行排序的,对于一直学习比较的排序算法,突然接触这个排序,有点突然而已。
如有错误,敬请指出,谢谢