JAVA十大排序算法之计数排序详解

JAVA十大排序算法之计数排序详解

计数排序概述

计数排序是一种非比较排序算法,它的时间复杂度为O(n+k),其中k是整数的范围。和桶排序一样,计数排序假设输入的数组中元素是平均分布的,但它不适用于元素范围过大的情况。

计数排序算法的思想:对于给定的一组数据,统计出小于等于这组数据中每个数的个数,利用这个统计信息,直接将每个元素放到它在输出数组中的位置上,从而达到排序的目的。

计数排序除了实现简单,而且相对于其他排序算法而言,它的效率比较高。但是,其缺点是比较难以应用到范围很大的数的排序中。

计数排序流程

计数排序的基本思想是将输入的数值转化为键存储在额外开辟的数组空间中,然后依次把计数大于1的填充回原始数组。以下是计数排序的具体流程:

  1. 找出待排序的数组中最大和最小的元素;
  2. 统计数组中每个值为 i 的元素出现的次数,存入数组C的第 i 项;
  3. 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
  4. 反向填充目标数组:将每个元素 i 放在新数组的第C(i)项,每放一个元素就将C(i)减去1;

计数排序Java代码实现

public static void countSort(int[] arr) {
    if (arr == null || arr.length <= 1) {
        return;
    }
    int max = arr[0], min = arr[0];
    // 找出数组中最大值和最小值
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
        if (arr[i] < min) {
            min = arr[i];
        }
    }

    int[] countArr = new int[max - min + 1];
    Arrays.fill(countArr, 0);
    // 统计每个值出现的次数
    for (int i = 0; i < arr.length; i++) {
        countArr[arr[i] - min]++;
    }
    // 累加计数
    for (int i = 1; i < countArr.length; i++) {
        countArr[i] += countArr[i - 1];
    }

    int[] sortedArr = new int[arr.length];
    // 反向填充目标数组
    for (int i = arr.length - 1; i >= 0; i--) {
        sortedArr[countArr[arr[i] - min] - 1] = arr[i];
        countArr[arr[i] - min]--;
    }

    System.arraycopy(sortedArr, 0, arr, 0, sortedArr.length);
}

计数排序的示例

下面展示一个简单的计数排序示例。

int[] arr = new int[]{3, 1, 4, 8, 5, 7, 6, 9, 2, 0};
countSort(arr);
System.out.println(Arrays.toString(arr));

输出结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

上述示例中,我们定义了一个包含10个元素的整型数组,然后调用countSort函数进行排序。计数排序根据上述的步骤进行排序,最终输出结果是有序的数组。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA十大排序算法之计数排序详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • SpringBoot 整合mapstruct的实现步骤

    下面是详细讲解“SpringBoot 整合 MapStruct 的实现步骤”的完整攻略。 什么是 MapStruct MapStruct 是一个在编译时期通过注解自动生成 Java Bean 映射代码的框架。它具有简单易用、高效准确等特点,可以大幅度提升 Java Bean 映射的开发效率。 SpringBoot 整合 MapStruct 的实现步骤 步骤一…

    Java 2023年5月20日
    00
  • mybatis自动填充时间字段示例代码

    为了实现 mybatis 自动填充时间字段的功能,需要在实体类中加入 createTime 和 updateTime 字段,并使用注解 @TableField(fill = FieldFill.INSERT) 标记 createTime 字段,在新增时自动填入当前时间,使用注解 @TableField(fill = FieldFill.INSERT_UPDA…

    Java 2023年5月20日
    00
  • Java获取当前时间方法总结

    Java获取当前时间方法总结 在Java中,有多种方法可以获取当前时间。本文将总结其中常用的方法,并提供示例代码。 方法一:使用System.currentTimeMillis() System.currentTimeMillis()方法返回当前时间的毫秒数。可以使用这个值来获取当前时间。 示例代码: long currentTimeMillis = Sys…

    Java 2023年5月20日
    00
  • Spring Boot集群管理工具KafkaAdminClient使用方法解析

    Spring Boot集群管理工具KafkaAdminClient使用方法解析 KafkaAdminClient是一个管理Kafka集群的Java API,它提供了创建,删除和修改Kafka集群的主题、分区和副本的API。本文将详细介绍KafkaAdminClient的使用方法。 配置KafkaAdminClient 在Spring Boot项目中使用Kaf…

    Java 2023年5月20日
    00
  • java8 计算时间差的方法示例

    Java8 计算时间差的方法示例 计算时间差在很多应用场景中都非常常见,比如计算两个时间点之间的时间差、计算函数或方法的执行时间等等。本文将介绍在 Java8 中计算时间差的方法及示例,通过使用 Java8 提供的 DateTime API,可以轻松地对时间进行计算和格式化。 1. 使用 Duration 类计算时间差 Duration 类是 Java8 中…

    Java 2023年5月20日
    00
  • 跨站脚本攻击XSS原理与防范实例分析

    跨站脚本攻击XSS原理与防范实例分析 XSS攻击原理 跨站脚本攻击(XSS)是通过在web应用程序中注入恶意脚本来攻击用户的一种常见安全漏洞。攻击者可将攻击代码注入到正常的web页面中,一旦被用户浏览器执行,就能够窃取用户的敏感信息或者利用用户的身份进行恶意操作。 XSS攻击通常分为以下三种类型: 存储型攻击:攻击者将恶意脚本注入到web应用程序中的数据库中…

    Java 2023年6月16日
    00
  • 微信小程序 登录的简单实现

    当我们需要使用微信用户信息或微信提供的其他服务(如微信支付)时,我们需要使用微信提供的登录功能来获取用户的授权信息。本文将详细介绍如何使用微信小程序中的登录功能来获取用户授权,实现微信小程序的登录功能。 步骤一:接入微信登录功能 在小程序开发中,我们可以使用微信提供的 wx.login() 方法来获取用户登录的 code。这个 code 可以通过后台与微信服…

    Java 2023年5月23日
    00
  • SpringBoot实现分页功能

    SpringBoot实现分页功能的完整攻略 在SpringBoot中,我们可以使用Spring Data JPA和Spring MVC来实现分页功能。以下是一个详细的实现攻略: 1. 添加依赖 在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework.boot</g…

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部