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日

相关文章

  • Java Validation Api实现原理解析

    Java Validation API 实现原理解析 简介 Java Validation API 是用于数据验证的标准 Java Bean 验证框架。该框架的目的是通过注释处理器来实现强类型的数据验证,以使编写验证代码变得简单易懂,同时保证数据验证的正确性和可维护性。 原理 Java Validation API 的实现原理主要包括以下几个方面: 注释处理…

    Java 2023年5月20日
    00
  • Java经典面试题汇总:JVM

    Java经典面试题汇总:JVM JVM是什么? JVM(Java Virtual Machine,即Java虚拟机)是Java平台的一个重要组成部分,也是整个Java技术体系的核心所在。它是Java实现“一次编写,到处运行”的重要基石,同时也是Java能够拥有强大的跨平台能力的主要原因之一。 当我们运行Java程序时,JVM会解释并执行Java字节码,最终把…

    Java 2023年5月23日
    00
  • 如何将SpringBoot项目打成 war 包并部署到Tomcat

    下面是将SpringBoot项目打成war包并部署到Tomcat的详细攻略。 1. 添加依赖 首先,我们需要在SpringBoot项目中添加Tomcat的依赖,以及修改pom.xml文件中的打包方式为war。 <!– 添加Tomcat的依赖 –> <dependency> <groupId>org.springfram…

    Java 2023年6月2日
    00
  • 深入Java对象的地址的使用分析

    让我们来详细讲解一下深入Java对象的地址的使用分析的完整攻略。 概述 Java中的对象占用内存空间,对象的地址是用一个指针来表示的。在Java代码中,我们可以使用对象的引用来访问该对象,但在底层,JVM是通过引用所对应的对象地址来操作该对象的。因此,深入Java对象的地址的使用分析对于提高Java程序的性能和调试程序都是非常有帮助的。 获取对象地址 获取对…

    Java 2023年5月26日
    00
  • 任意Json转成无序列表的方法示例

    下面是详细讲解“任意Json转成无序列表的方法示例”的完整攻略。 1. 理解Json数据格式 首先,我们需要了解Json数据格式。Json是一种轻量级的数据交换格式,它可以表示对象、数组、字符串、数字、布尔值和null。Json对象由花括号{}包裹,对象中包含各种键值对,键值对之间用逗号分隔;Json数组由方括号[]包裹,数组中包含各种数据类型,数据之间用逗…

    Java 2023年6月16日
    00
  • java时间戳转日期格式的实现代码

    下面是Java时间戳转日期格式的实现代码的完整攻略。 问题背景 时间戳是指从某个固定时间(如 1970年1月1日00:00:00 UTC)起经过的毫秒数,通常用于记录某个时间点的信息。在Java开发中,我们经常需要将时间戳转换为可读的日期格式,以便于显示、存储等操作。 实现步骤 Java提供了多种方式将时间戳转化为日期格式,最常用的方式是使用SimpleDa…

    Java 2023年5月20日
    00
  • IDEA下lombok安装及找不到get,set的问题的解决方法

    IDEA下lombok安装及找不到get,set的问题的解决方法 什么是Lombok Lombok是一个Java库,旨在通过注解的形式来简化Java对象的样板代码,例如Getter/Setter方法、构造函数、toString()方法等。Lombok可以使开发人员编写代码更加简短、易读和易于维护。通过引入Lombok库,Java开发人员可以使代码更加简洁,在…

    Java 2023年5月27日
    00
  • struts2中一个表单中提交多个请求的例子(多个提交按钮)

    在struts2中实现一个表单中提交多个请求的例子,常见的方法是使用多个提交按钮,每个按钮对应一个请求。以下是详细的步骤: 1. 编写表单 首先在jsp页面中编写表单,并使用<s:submit>标签来生成提交按钮。每个不同的提交按钮会绑定不同的请求。例如: <s:form action="processForm">…

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