对于排序,对于第一次看计数排序代码,则会被数组的嵌套绕晕,最好的方式就是,将数组代入,一步一步执行,便能更好的理解代码。

计数排序的代码为:

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);

之所以写这个,是因为计数排序不是通过比较来进行排序的,对于一直学习比较的排序算法,突然接触这个排序,有点突然而已。

 

如有错误,敬请指出,谢谢