5.2 计数排序

来源:互联网 发布:vscode 修改字体颜色 编辑:程序博客网 时间:2024/06/11 09:42

前提假设: 假设输入的待排序的n个元素中的每一个值都在0到k区间中的一个整数(k为某个整数)。
基本思想: 对于每一个输入元素x,统计小于x的元素个数,确定x元素在输出数组中的位置。例如,如果有17个元素小于x,则x就应该放在输出数组的第18个位置。当有元素相等时,这个情况另外在讨论。
时间复杂度: O(k+n),当k=O(n)时,该算法的时间复杂度为O(n)。此时,我们会用计数算法。
算法特点: 该算法是稳定的;对于相同的两个数来说,在输入数组中先出现的数,在输出数组中也先出现。


java实现:

   /***     * 计数排序     * @param A   待排序的数组     * @param B   结果数组     * @param k   数组A中的所有元素都在0到k区间的一个整数     */    public static void countingSort(int[] A,int[] B,int k){        //提供临时存储空间,用来统计值等于A[j]的元素的个数        int[] C=new int[k];                     for (int i = 0; i < k; i++) {            C[i]=0;        }        for (int i : A) {            C[i]++;      //统计值等于A[i]的元素的个数        }        //统计小于等于i的元素的个数        for (int i = 1; i <= k; i++) {            C[i]=C[i]+C[i-1];        }        //把每个A[i]放在输出数组B的正确位置        //对于每个A[i]来说,C[A[i]]就是A[i]在输出数组中的位置        for (int i = A.length-1; i >= 0; i--) {            B[C[A[i]]-1]=A[i];            //当下一个值等于A[i]的元素,可以直接放在输出数组中A[i]的前一个位置            C[A[i]]--;        }    }
0 0