排序算法之计数排序(Java 版本)

计数排序是一个非基于比较的排序算法。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的算法。

基本思想

计数排序的基本思想是:对每一个输入元素 x,确定小于 x 的元素个数。例如,如果有7个元素小于 x,则 x 就应该在第8个输出位置上。

运行过程
  • 准备:
    输入数组:array[1…n]。
    输出数组:result[1…n]。
    临时储存数组:countArray[0…k]。
  • 计算array中每个元素的个数,存放到countArray数组:将array数组中的元素值作为countArray数组的下标,array中元素每重复出现一次countArray数组对应元素+1。
  • 计算小于array数组中小于当前元素的个数= countArray数组当前元素中与前一个元素的加和。并将数据更新到countArray数组中
  • 根据countArray数组中小于当前元素的个数来确定array数组中元素在 result数组中的存放位置。
代码实现
    /**
     * 计数排序
     * @param array 待排序数组
     * @param k 临时数组长度,取值为排序数组的最大值+1
     *          (此处是因为 array 中的元素被作为数组下标,所以数组长度为最大值+1)
     */
    private static void countSort(int[] array, int k) {
        //创建计数统计数组
        int[] countArray = new int[k];
        //计算 array 中每个元素的重复个数
        for (int i = 0; i < array.length; i++) {
            countArray[array[i]] += 1;
        }
        //计算数组中小于当前元素的元素个数
        for (int i = 0; i < k; i++) {
            if (i > 0) {
                countArray[i] = countArray[i] + countArray[i - 1];
            }
        }
        //结果输出数组
        int[] result = new int[array.length];
        //将 array 中的元素存放到 result 指定位置
        for (int i = array.length - 1; i >= 0; i--) {
            System.out.println("array:" + array[i] + " | countArray:" + countArray[array[i]]);
            //计算存放位置(小于当前元素的数量值-1即为数组下标)
            int pos = countArray[array[i]] -1;
            //根据计数统计数组将数组array中的元素存放到result数组中
            result[pos] = array[i];
            //小于当前元素的数量值-1
            countArray[array[i]] = pos;
        }
        
        System.out.println(Arrays.toString(result));

    }

迟到的更新,哈哈。计数排序感觉是一个并不常用到的算法,不过思路相对其他比较排序是比较清奇,值得了解学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值