排序算法--Distribution Sorting--分布排序[1]--Counting sort--计数器排序

Posted ```...简单点

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法--Distribution Sorting--分布排序[1]--Counting sort--计数器排序相关的知识,希望对你有一定的参考价值。

1.基本思想

  假设数序列中小于元素a的个数为n,则直接把a放到第n+1个位置上。当存在几个相同的元素时要做适当的调整,因为不能把所有的元素放到同一个位置上。计数排序假设输入的元素都是0到k之间的整数。

2.实现原理

  为一组数在排序之前先统计这组数中其他数小于这个数的个数,则可以确定这个数的位置。例如要排序的数为 7 4 2 1 5 3 1 5;则比7小的有7个数,所有7应该在排序好的数列的第八位,同理3在第四位,对于重复的数字,1在1位和2位(暂且认为第一个1比第二个1小),5和1一样位于6位和7位。

3.代码实例

(1)代码:

private static int[] countSort(int[] array, int k) {
    //建立两个数组:B数组和C数组
    int[] C = new int[k + 1];//构造C数组
    int length = array.length, sum = 0;//获取A数组大小用于构造B数组
    int[] B = new int[length];//构造B数组
    // 统计A中各元素个数,存入C数组
    for (int i = 0; i < length; i++) {
        C[array[i]] += 1;
    }
    //累积每个元素的个数:建立C数组的值
    for (int i = 0; i < k + 1; i++) {
        sum += C[i];
        C[i] = sum;
    }
    //遍历A数组,构造B数组
    for (int i = length - 1; i >= 0; i--) {
        B[C[array[i]] - 1] = array[i];//将A中该元素放到排序后数组B中指定的位置
        C[array[i]]--;//将C中该元素-1,方便存放下一个同样大小的元素:相同的元素依次排在后面
    }
    return B;//将排序好的数组返回,完成排序
}

public static void main(String[] args) {
    int[] A = new int[]{2, 5, 3, 0, 2, 3, 0, 3};
    int[] B = countSort(A, 5);
    for (int num : B) {
        System.out.print(num+" ");
    }
}

 

(2)结果:

   0 0 2 2 3 3 3 5

4.算法分析

计数排序是一种非常快捷的稳定性强的排序方法,时间复杂度O(n+k),其中n为要排序的数的个数,k为要排序的数的组大值。计数排序对一定量的整数排序时候的速度非常快,一般快于其他排序算法。但计数排序局限性比较大,只限于对整数进行排序。计数排序是消耗空间发杂度来获取快捷的排序方法,其空间复杂度为O(K) ,同理K为要排序的最大值。

 

 

以上是关于排序算法--Distribution Sorting--分布排序[1]--Counting sort--计数器排序的主要内容,如果未能解决你的问题,请参考以下文章

NDT(Normal Distribution Transform) 算法(与ICP对比)和一些常见配准算法

算法系列学习codeforces D. Mike and distribution 二维贪心

Phoenix and Distribution(字典序贪心)

[CF1054C]Candies Distribution

CF967D Resource Distribution

[AtCoder AGC27A]Candy Distribution Again