最近想到算法导论中的计数排序,看看理解的怎么样试着讲讲自己的理解。
1、思想:
计数排序 是 线性时间的 排序算法,时间复杂度为O(n),虽然有一定的局限性。但是还是很好的一种算法。
用2个数组进行额外的存储信息,数组 c[ ] 是对 数据中值相同的 记录下来,以便后面查阅;b[ ]是输出的有序数组,再将有序的数组输出。
2、范围:
计数排序是针对 在 一定取值范围 的 整数 数据。比如:a[ ]中 a[ i ]∈( 0 , 10 )。
3、代码:
<span style="font-size:14px;">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+" "); } } }</span>
这样就会看到 原本的数据 已经排好序了……
有问题,欢迎讨论……
时间: 2024-10-12 06:08:57