码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-04-04 15:02:48      阅读:315      评论:0      收藏:0      [点我收藏+]

标签:div   span   完成   ++   nts   方便   col   计数排序   n+1   

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为要排序的最大值。

 

 

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

标签:div   span   完成   ++   nts   方便   col   计数排序   n+1   

原文地址:https://www.cnblogs.com/yysbolg/p/8716327.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!