走过路过不要错过,有钱捧个钱场,没钱捧个人场. 欢迎欢迎|

志旋

园龄:4年10个月粉丝:5关注:1

2021-08-11 09:36阅读: 26评论: 0推荐: 0

算法-计数排序

计数排序

计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。 [1] 当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(nlog(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(nlog(n)), 如归并排序,堆排序)

算法步骤

  • 找到数组arr 中的最大值为 max
  • 创建一个桶数组bucket=int[max+1] , i代表的是就是arr里面的值,value就是arr 出现的个数
  • 统计数组中每个值为i的元素出现的次数,存入数组的第i项
  • 反向填充目标数组arr ,遍历 bucket 值大于0的就往arr反向填充

演示

计数排序

代码



public class CountSort {

    public static int[] countSort(int[] arr) {

        // step 1: 找到最大值
        int max = Integer.MIN_VALUE;
        for (int i : arr) {
            max = Math.max(max, i);
        }

        // step 2:创建桶数组
        int[] bucket = new int[max + 1];
        for (int i : arr) {
            bucket[i]++;
        }

        int index = 0;
        // step 3: 将桶中的数倒出
        for (int i = 0; i < bucket.length; i++) {
            while (bucket[i] > 0) {
                arr[index++] = i;
                bucket[i]--;
            }
        }
        return arr;
    }

    public static void main(String[] args) {
        int[] arr = {7, 1, 5, 9, 3, 11, 55, 33, 8, 16};
        final int[] arr2 = countSort(arr);
        for (int i : arr2) {
            System.out.print(i + " ");
        }
    }
}

本文作者:志旋

本文链接:https://www.cnblogs.com/wuzhixuan/p/15126858.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   志旋  阅读(26)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起