Java 十大排序算法之计数排序刨析

 更新时间:2021年11月24日 09:17:37   作者:龍弟-idea  
计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法

计数排序是非比较的排序算法,用辅助数组对数组中出现的数字计数,元素转下标,下标转元素

计数排序优缺点

优点:快

缺点:数据范围很大,比较稀疏,会导致辅助空间很大,造成空间的浪费

使用范围:数据较为密集或范围较小时适用。

思路

1.找出最大元素max

2.初始化一个max+1的数组

3.将每个元素的计数存储在数组中各自的索引处

4.存储计数数组元素的累积和

5.数组中找到原始数组的每个元素的索引

计数排序代码实现

public class CountingSort {
    private static int[] countingSort(int[] arr) {
        //1、求取最大值和最小值,计算中间数组的长度:中间数组是用来记录原始数据中每个值出现的频率
        int min = arr[0], max = arr[0];
        for (int i : arr) {
            if (i > max) {
                max = i;
            }
            if (i < min) {
                min = i;
            }
        }
 
        //2、有了最大值和最小值能够确定中间数组的长度
        //例如存储 5-0+1=6
        int[] countArray = new int[max - min + 1];
 
        //3、循环遍历旧数组计数排序: 就是统计原始数组值出现的频率到中间数组B中
        for (int i : arr) {
            countArray[i - min] += 1; //数的位置上+1
        }
 
        //4、统计数组做变形,后边的元素等于前面的元素之和
        for (int i = 1; i < countArray.length; i++) {
            countArray[i] += countArray[i - 1];
        }
 
        //5、倒序遍历原始数组,从统计数组中找到正确的位置,输出到结果数组
        int[] resultArray = new int[arr.length];
        for (int i = arr.length - 1; i >= 0; i--) {
            //给resultArray的当前位置赋值
            resultArray[countArray[arr[i] - min] - 1] = arr[i];
            //给countArray的位置的值--
            countArray[arr[i] - min]--;
        }
        return resultArray;
    }
 
    public static void main(String[] args) {
        int[] arr = {1,28,3,21,11,7,6,18};
        int[] sortedArr = countingSort(arr);
        System.out.println(Arrays.toString(sortedArr));
    }
}

时间复杂度:O(n+k)

到此这篇关于Java 十大排序算法之计数排序刨析的文章就介绍到这了,更多相关Java 计数排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IDEA创建Maven项目一直显示正在加载的问题及解决

    IDEA创建Maven项目一直显示正在加载的问题及解决

    这篇文章主要介绍了IDEA创建Maven项目一直显示正在加载的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 关于Java中避免空指针的方法

    关于Java中避免空指针的方法

    这篇文章主要介绍了关于Java中避免空指针的方法,空指针异常就是我们在对空对象进行的任何操作都会报空指针异常,所谓的指针,就是java中的对象的引用,比如String s;这个就是指针,需要的朋友可以参考下
    2023-07-07
  • IDEA中没有Mapper.xml模板选项的处理方法

    IDEA中没有Mapper.xml模板选项的处理方法

    这篇文章主要介绍了IDEA中没有Mapper.xml模板选项的处理方法,需其实解决方法很简单,只需要在idea中导入模板即可,本文图文的形式给大家分享解决方法,需要的朋友可以参考下
    2021-04-04
  • HttpMessageConverter报文信息转换器的深入讲解

    HttpMessageConverter报文信息转换器的深入讲解

    在Spring中内置了大量的HttpMessageConverter,通过请求头信息中的MIME类型,选择相应的HttpMessageConverter,这篇文章主要给大家介绍了关于HttpMessageConverter报文信息转换器的相关资料,需要的朋友可以参考下
    2022-01-01
  • Flink时间和窗口逻辑处理源码分析

    Flink时间和窗口逻辑处理源码分析

    这篇文章主要为大家介绍了Flink时间和窗口逻辑处理源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • JSON Web Token在登陆中的使用过程

    JSON Web Token在登陆中的使用过程

    这篇文章主要介绍了JSON Web Token在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Java Hutool 包工具类推荐 ExcelUtil详解

    Java Hutool 包工具类推荐 ExcelUtil详解

    这篇文章主要介绍了Java Hutool 包工具类推荐 ExcelUtil详解,需要引入hutool包,版本号可根据实际情况更换,除hutool包之外,还需要引入操作Excel必要包,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • 关于dubbo的超时处理及重试原则

    关于dubbo的超时处理及重试原则

    这篇文章主要介绍了关于dubbo的超时处理及重试原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Java双向链表倒置功能实现过程解析

    Java双向链表倒置功能实现过程解析

    这篇文章主要介绍了Java双向链表倒置功能实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java CountDownLatch的源码硬核解析

    Java CountDownLatch的源码硬核解析

    对于并发执行,Java中的CountDownLatch是一个重要的类。为了更好的理解CountDownLatch这个类,本文将通过例子和源码带领大家深入解析这个类的原理,感兴趣的可以学习一下
    2022-10-10

最新评论