算法——排序之计数排序

最近想到算法导论中的计数排序,看看理解的怎么样试着讲讲自己的理解。

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+" ");
        }
    }
}
这样就会看到 原本的数据 已经排好序了……

有问题,欢迎讨论……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章