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函数进行排序。计数排序根据上述的步骤进行排序,最终输出结果是有序的数组。

阅读剩余 39%

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

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

相关文章

  • MySQL筑基篇之增删改查操作详解

    MySQL筑基篇之增删改查操作详解 一、准备工作 在开始进行MySQL的增删改查操作前,需要先做一些准备工作。首先需要安装MySQL数据库,可以通过官方网站下载,并安装在本地机器上。安装完成后,需要登录MySQL,创建数据库并创建数据表。 1.1 登录MySQL 在命令行或终端中输入以下代码,登录MySQL: mysql -u root -p 其中,root…

    Java 2023年5月26日
    00
  • SpringBoot基于数据库实现定时任务过程解析

    下面是关于“Spring Boot基于数据库实现定时任务过程解析”的完整攻略。 1. 背景 定时任务在业务逻辑中经常被使用,而且很多时候任务调度需要依赖于数据库中的数据。Spring Boot中提供了很方便的方式来实现定时任务的功能,而且也支持基于数据库的方式来实现任务调度,本文将详细讲解如何使用Spring Boot实现基于数据库的定时任务调度。 2. 实…

    Java 2023年5月26日
    00
  • 基于javaweb+jsp实现个人日记管理系统

    让我来详细解析一下“基于javaweb+jsp实现个人日记管理系统”的攻略吧。首先,我们需要了解这个系统的基本要素:JavaWeb以及JSP。 一、JavaWeb JavaWeb是指基于Java语言所开发的Web应用程序,在软件开发工程中,开发人员可以使用JavaWeb技术,实现分布式系统的实现。JavaWeb技术是建立在Java平台之上的,包含许多组件,例…

    Java 2023年5月20日
    00
  • Java获取此次请求URL以及服务器根路径的方法

    获取此次请求URL和服务器根路径是Web开发中常用的操作,Java也提供了相应的方法来实现这个功能。下面是详细的攻略: 获取此次请求URL 方式一:使用HttpServletRequest对象 在Java Servlet中,通过HttpServletRequest对象可以获取此次请求的相关信息。其中,getRequestURL()方法可以获取请求的URL,如…

    Java 2023年6月15日
    00
  • Java的JDBC和桥接模式详解

    Java的JDBC和桥接模式详解 JDBC简介 Java数据库连接(JDBC)是Java语言编写的应用程序和数据库之间的中间件软件层,它使得Java程序可以通过SQL语句访问数据库。JDBC提供了一组标准的SQL语句,并通过Java API提供了不同数据库的连接。 JDBC主要包括以下四种类型的驱动程序: JDBC-ODBC桥式驱动程序 基于本地API的驱动…

    Java 2023年5月26日
    00
  • Java中使用json与前台Ajax数据交互的方法

    请看下面的完整攻略: Java中使用json与前台Ajax数据交互的方法 在前后端分离的开发模式中,我们通常使用Ajax进行数据交互,而json作为一种轻量级的数据格式,具有传输速度快、数据量小、易于解析等优点,因此被广泛应用于前后端的数据交互。本文将介绍Java中使用json与前台Ajax数据交互的方法。 一、搭建环境 为了演示方便,我们将使用Spring…

    Java 2023年5月26日
    00
  • 利用5分钟快速搭建一个springboot项目的全过程

    下面是详细的攻略过程,包括两个示例。 前置条件 在开始搭建 Spring Boot 项目之前,需要确保以下环境已经安装和配置好: Java JDK 8+,可使用 java -version 命令检查 Java 安装情况。 Maven 3.0+,可使用 mvn -v 命令检查 Maven 安装情况。 IntelliJ IDEA(或其他任意一款 IDE) 步骤一…

    Java 2023年5月15日
    00
  • 浅析Java.IO输入输出流 过滤流 buffer流和data流

    浅析Java.IO输入输出流 过滤流 Buffer流和Data流 什么是Java IO Java IO 是针对输入和输出数据的流处理 API。Java IO 库中包含了一组类和接口,提供了对标准输入、输出和文件系统的访问。 在 Java IO 中,数据承载的载体为流(stream)。流是指在数据源和数据目的地之间建立起的一条虚拟的传输通道,数据按照字节的方式…

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