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

yizhihongxing

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日

相关文章

  • 一文告诉你如何解决Tomcat乱码问题(很详细!)

    下面是详细讲解“一文告诉你如何解决Tomcat乱码问题(很详细!)”的完整攻略。 什么是Tomcat乱码问题? 在Java Web开发中,通常会使用Tomcat作为Web服务器。但是,在处理中文字符时,有时候会出现乱码问题(例如,读取数据库中的中文数据时显示乱码),这就是Tomcat乱码问题。 如何解决Tomcat乱码问题? 以下是解决Tomcat乱码问题的…

    Java 2023年5月19日
    00
  • Java实现读取resources目录下的文件路径的九种方式

    Java实现读取resources目录下的文件路径通常有以下九种方式: 1. 使用ClassLoader的getResource()方法 在Java中,可以使用ClassLoader的getResource()方法获取resources目录下的文件路径。示例代码如下: URL resource = getClass().getClassLoader().ge…

    Java 2023年6月15日
    00
  • Spring mvc是如何实现与数据库的前后端的连接操作的?

    Spring MVC 是一个基于 Java 的 Web 框架,它提供了一种简单的方式来构建 Web 应用程序。在 Spring MVC 中,我们可以使用多种方式来实现与数据库的前后端连接操作,包括使用 JDBC、使用 ORM 框架等。本文将详细讲解 Spring MVC 如何实现与数据库的前后端连接操作,包括如何使用 JDBC、使用 MyBatis 框架,并…

    Java 2023年5月18日
    00
  • Spring AOP源码深入分析

    关于“Spring AOP源码深入分析”的完整攻略,以下是我总结的步骤: 第一步:环境准备 首先,我们需要配置好Maven、Java、IDEA等相关工具。 第二步:理解AOP的基本概念 在开始深入分析Spring AOP源码之前,我们需要了解一些AOP的基本概念,例如:切面(Aspect)、连接点(join point)、通知(Advice)、切点(poin…

    Java 2023年5月19日
    00
  • Spring MVC入门_动力节点Java学院整理

    以下是关于“Spring MVC入门_动力节点Java学院整理”的完整攻略,其中包含两个示例。 Spring MVC入门 Spring MVC是Spring框架的一个模块,它是一个基于MVC(Model-View-Controller)架构的Web框架,用于构建Web应用程序。本攻略将介绍Spring MVC的基本概念、执行流程和使用方法。 1. Sprin…

    Java 2023年5月16日
    00
  • 浅谈一个基础的SpringBoot项目该包含哪些

    一个基础的SpringBoot项目应该包含以下几个部分: 1. 项目结构 一般来说,一个Spring Boot 项目的包结构应该包含三个主要部分:application、config 和 controller。 application: 启动类的所在包,在 Spring Boot 项目中只能有一个,一般放在项目的根目录下。 config: 配置类所在的包,这…

    Java 2023年5月19日
    00
  • spring异步service中处理线程数限制详解

    Spring异步Service中处理线程数限制详解 异步Service基础知识 在Spring中,我们可以使用@Async注解来定义一个异步方法。这个方法会在调用时在单独的线程中执行,而不是在当前请求线程中执行。 以下是一个简单的示例,演示了如何使用@Async注解: @Service public class MyService { @Async publ…

    Java 2023年5月19日
    00
  • 什么是JVM参数?

    JVM参数是用于控制JVM行为的命令行参数。JVM参数可以分为两大类:标准参数和非标准参数。 标准参数 标准参数指的是JVM规范中定义的参数,它们可以在所有的JVM实现中使用。以下是一些常见的标准参数。 -Xmx 用于设置JVM最大可用内存大小。例如,以下命令行将JVM最大内存设置为2G: java -Xmx2g MyApp -Xms 用于设置JVM初始内存…

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