最近想到算法导论中的计数排序,看看理解的怎么样试着讲讲自己的理解。
1、思想:
计数排序 是 线性时间的 排序算法,时间复杂度为O(n),虽然有一定的局限性。但是还是很好的一种算法。
用2个数组进行额外的存储信息,数组 c[ ] 是对 数据中值相同的 记录下来,以便后面查阅;b[ ]是输出的有序数组,再将有序的数组输出。
2、范围:
计数排序是针对 在 一定取值范围 的 整数 数据。比如:a[ ]中 a[ i ]∈( 0 , 10 )。
3、代码:
public class CountingSort {
public static int[] sort(int []a,int k){ // a 是输入数组 k 是可取的最大值 即取值在 (0,k)范围内
int num = a.length;
int []b = new int[num]; // 输出的有序数组
int []c = new int[k]; //临时计数数组
for(int i=0;i<num;i++){ //初始化数组
b[i]=0;
c[i]=0;
}
for(int i=0;i<num;i++){ //对 a 中值都为 a[i] 的数据进行计数 并记录c[a[i]] 中,如 c[5] = 3 就表示 a[]中有 3个 值为 5 的数据。
c[a[i]] +=1;
}
for(int i=1;i<k;i++){ //对整体进行计数累加
c[i]+=c[i-1];
}
for(int i=num-1;i>=0;i--){ //对a[] 中数据倒序访问进行赋值到 b[]中 这样a[i]就会到它排序后应该在的位置了
b[--c[a[i]]] = a[i];
}
return b;
}
public static void main(String[] args) {
int []a = {2,5,7,4,9,5,7,2,6,0};
for(int i:a){
System.out.print(i + " ");
}
System.out.println();
a = sort(a,10);
for(int i:a){
System.out.print(i+" ");
}
}
}
这样就会看到 原本的数据 已经排好序了……
有问题,欢迎讨论……