当前位置: 首页 > news >正文

排序算法之计数排序详细解读(附带Java代码解读)

计数排序(Counting Sort)是一种非比较型的排序算法,它通过统计每个元素的出现频率,然后计算元素的位置信息,最后将元素放到正确的位置,从而实现排序。计数排序特别适用于元素范围有限的情况,比如整数的范围较小。

算法思想

计数排序的基本思想是:

  1. 确定范围:找出待排序数据的最小值和最大值。
  2. 计数:创建一个计数数组,用来统计每个元素出现的次数。
  3. 累积:将计数数组中的计数值累积,以确定每个元素的最终位置。
  4. 排序:根据累积的计数信息将元素放到正确的位置。

过程示例

假设有一个待排序的数组:[4, 2, 2, 8, 3, 3, 1]

步骤 1: 确定范围

  1. 找到最小值和最大值:
    • 最小值 = 1
    • 最大值 = 8

步骤 2: 计数

  1. 创建一个计数数组 count,大小为 最大值 - 最小值 + 1

    • count 数组大小为 8(从 1 到 8)。
    • 初始化 count 数组为全零:count = [0, 0, 0, 0, 0, 0, 0, 0]
  2. 统计每个元素出现的次数:

    • 4 → count[4 - 1] += 1count = [0, 0, 0, 1, 0, 0, 0, 0]
    • 2 → count[2 - 1] += 1count = [0, 1, 0, 1, 0, 0, 0, 0]
    • 2 → count[2 - 1] += 1count = [0, 2, 0, 1, 0, 0, 0, 0]
    • 8 → count[8 - 1] += 1count = [0, 2, 0, 1, 0, 0, 0, 1]
    • 3 → count[3 - 1] += 1count = [0, 2, 1, 1, 0, 0, 0, 1]
    • 3 → count[3 - 1] += 1count = [0, 2, 2, 1, 0, 0, 0, 1]
    • 1 → count[1 - 1] += 1count = [1, 2, 2, 1, 0, 0, 0, 1]

步骤 3: 累积

  1. count 数组进行累积:

    • count = [1, 3, 5, 6, 6, 6, 6, 7]
  2. 累积过程:

    • count[1] += count[0]count = [1, 3, 2, 1, 0, 0, 0, 1]
    • count[2] += count[1]count = [1, 3, 5, 1, 0, 0, 0, 1]
    • count[3] += count[2]count = [1, 3, 5, 6, 0, 0, 0, 1]
    • count[4] += count[3]count = [1, 3, 5, 6, 6, 0, 0, 1]
    • count[5] += count[4]count = [1, 3, 5, 6, 6, 6, 0, 1]
    • count[6] += count[5]count = [1, 3, 5, 6, 6, 6, 6, 1]
    • count[7] += count[6]count = [1, 3, 5, 6, 6, 6, 6, 7]

步骤 4: 排序

  1. 创建一个输出数组 output,用于存放排序后的结果:

    • output = [0, 0, 0, 0, 0, 0, 0, 0]
  2. 从原数组中取出元素,并根据 count 数组确定其位置:

    • 4 → output[count[4 - 1] - 1] = 4count[4 - 1] -= 1output = [0, 0, 0, 4, 0, 0, 0, 0]
    • 2 → output[count[2 - 1] - 1] = 2count[2 - 1] -= 1output = [0, 0, 2, 4, 0, 0, 0, 0]
    • 2 → output[count[2 - 1] - 1] = 2count[2 - 1] -= 1output = [0, 2, 2, 4, 0, 0, 0, 0]
    • 8 → output[count[8 - 1] - 1] = 8count[8 - 1] -= 1output = [0, 2, 2, 4, 0, 0, 0, 8]
    • 3 → output[count[3 - 1] - 1] = 3count[3 - 1] -= 1output = [0, 2, 2, 3, 0, 0, 0, 8]
    • 3 → output[count[3 - 1] - 1] = 3count[3 - 1] -= 1output = [0, 2, 2, 3, 3, 0, 0, 8]
    • 1 → output[count[1 - 1] - 1] = 1count[1 - 1] -= 1output = [1, 2, 2, 3, 3, 0, 0, 8]

    最终 output 数组为:[1, 2, 2, 3, 3, 4, 8]

算法复杂度

  • 时间复杂度:

    • 最坏情况: O(n + k)
    • 平均情况: O(n + k)
    • 最佳情况: O(n + k)

    其中,n 是元素的数量,k 是元素的范围(最大值 - 最小值 + 1)。

  • 空间复杂度: O(n + k) 需要额外的空间来存储计数数组和输出数组。

优点

  1. 稳定排序:计数排序是一种稳定的排序算法,即相同元素的相对顺序不会改变。
  2. 时间复杂度低:在元素范围有限的情况下,时间复杂度接近线性。

缺点

  1. 空间复杂度高:需要额外的空间来存储计数数组,特别是当元素的范围很大时。
  2. 不适用大范围数据:当数据范围远大于元素数量时,计数排序的空间复杂度可能变得不可接受。

Java代码解读

public class CountingSort {// 主方法:执行计数排序public static void countingSort(int[] arr) {if (arr.length == 0) return;// 1. 找到最小值和最大值int min = arr[0];int max = arr[0];for (int num : arr) {if (num < min) min = num;if (num > max) max = num;}// 2. 创建计数数组int range = max - min + 1;int[] count = new int[range];int[] output = new int[arr.length];// 3. 计数每个元素的出现次数for (int num : arr) {count[num - min]++;}// 4. 累积计数数组for (int i = 1; i < range; i++) {count[i] += count[i - 1];}// 5. 排序元素到输出数组for (int i = arr.length - 1; i >= 0; i--) {output[count[arr[i] - min] - 1] = arr[i];count[arr[i] - min]--;}// 6. 将排序结果复制回原数组System.arraycopy(output, 0, arr, 0, arr.length);}public static void main(String[] args) {int[] arr = {4, 2, 2, 8, 3, 3, 1};System.out.println("排序前的数组:");for (int num : arr) {System.out.print(num + " ");}System.out.println();countingSort(arr);System.out.println("排序后的数组:");for (int num : arr) {System.out.print(num + " ");}}
}

代码说明

  1. countingSort方法:

    • countingSort 方法首先找到数组的最小值和最大值,然后创建计数数组和输出数组。
    • 统计每个元素的出现次数,并将计数数组进行累积。
    • 根据累积的计数信息将元素放到正确的位置,并将排序结果复制回原数组。
  2. 找最小值和最大值:

    • 确定数据的范围,以便创建适当大小的计数数组。
  3. 计数每个元素:

    • 使用计数数组统计每个元素的出现次数。
  4. 累积计数数组:

    • 将计数数组累积,以确定每个元素的最终位置。
  5. 排序到输出数组:

    • 根据累积计数信息将元素放到正确的位置,并将排序结果复制回原数组。

 

 

相关文章:

排序算法之计数排序详细解读(附带Java代码解读)

计数排序&#xff08;Counting Sort&#xff09;是一种非比较型的排序算法&#xff0c;它通过统计每个元素的出现频率&#xff0c;然后计算元素的位置信息&#xff0c;最后将元素放到正确的位置&#xff0c;从而实现排序。计数排序特别适用于元素范围有限的情况&#xff0c;比如…...

Linux:如何使用 Crontab

今天想了解一下Linux Crontab。嗯&#xff0c;在Windows上&#xff0c;可以看做和定时任务差不多。 “要在特定时间进行特定工作。” 如果是这样&#xff0c;可以使用crontab&#xff0c;轻松使用Linux。 1. 基本 (crontab basic) 先看一下基本的crontab使用方法吧。在Linu…...

AI模型:追求全能还是专精?-- 之7 智能工厂程序设计

Q1、感觉上上面离我想做的事情却来越远了。我们跳过讨论直接进入程序设计吧。StringProcessor&#xff08;文字/信息/数字&#xff09;抽象代理工厂-创造 Universal given时空区域 |bar PROCESS: 页面版块的图式schema/概念的KE图式CaseFilter 一般应用工厂-制造- General sign…...

如何在本地服务器部署SeaFile自托管文件共享服务结合内网穿透打造私有云盘?

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 下载安装3.2 Cpolar注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4.公网访问测试5.结语 1. 前言 本文主要为大家介绍&#xff0c;如何使用两个简单软件…...

学习记录:js算法(二十五):合并两个有序链表

文章目录 合并两个有序链表我的思路网上思路 总结 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 图一 示例 1&#xff1a;&#xff08;如图一&#xff09; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] …...

43. 1 ~ n 整数中 1 出现的次数【难】

comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9843.%201%EF%BD%9En%E6%95%B4%E6%95%B0%E4%B8%AD1%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%E6%95%B0/README.md 面试题 43. 1 &#xff5e; n 整数中 1 …...

K8S - 理解volumeMounts 中的subpath

在上一篇文章中 springboot service如何动态读取外部配置文件 介绍了springboot 中如何实时读取外部配置文件的内容 部署在K8S 接下来我把它部署在k8s 首先&#xff0c; 我们把配置文件放入项目某个目录 这步部是必须的&#xff0c; 毕竟我们要引入是项目外部的文件&#xf…...

java工程师成功转型大数据

时间&#xff1a;2024年09月06日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频&#xff1a;喜马拉雅 希望大家帮个忙&#xff01;如果大家有工作机会&#xff0c;希望帮小蒋推荐一下&#xff0c;小蒋希望遇到一个认真做事…...

visual studio 2022更新以后,之前的有些工程编译出错,升级到Visual studio Enterprise 2022 Preview解决

系列文章目录 文章目录 系列文章目录前言一、解决方法 前言 今天遇到一个问题&#xff1a;visual studio 2022升级成预览版以后&#xff0c;之前的有些工程编译出错。首先代码、项目设置都没有改变&#xff0c;只是更新了visual studio 2022。 在编译工程时&#xff0c;编译器…...

Linux 性能调优技巧

1理解 Linux 性能的基本组成 CPU 使用率&#xff1a;衡量 CPU 在单位时间内被占用的程度。内存使用&#xff1a;关注的是活跃内存与缓存内存的比例&#xff0c;以及是否有过多的交换。I/O 性能&#xff1a;磁盘读写速度直接影响应用程序的响应时间和吞吐量。网络性能&#xff…...

【网络安全】WordPress Uncontrolled Resource Consumption

未经许可,不得转载。 文章目录 WordPresswp-cron.php实战漏洞危害解决措施WordPress WordPress 是全球最广泛使用的内容管理系统(CMS),目前约有 43% 的网站依赖于它。由于其用户友好的界面和丰富的插件功能,WordPress 成为了全球最受欢迎的 CMS。 然而,在使用 WordPres…...

gitee绑定公钥后依旧无法使用_gitee push添加公钥无效

解决&#xff1a; 步骤按照官网操作即可&#xff1a;gitee官方说明 看看远程地址是否使用的http模式&#xff0c;是的话换ssh模式...

Linux 删除 当前下的 mysql-8.0.31 空文件夹

在Linux中&#xff0c;如果你想要删除当前目录下的名为mysql-8.0.31的空文件夹&#xff08;即该文件夹内没有任何文件或子文件夹&#xff09;&#xff0c;你可以使用rmdir命令。但是&#xff0c;如果mysql-8.0.31文件夹并非完全为空&#xff08;即它包含文件或子文件夹&#xf…...

2024,中国服务器操作系统迎云智主升浪

“主升浪”描述了股市中一轮行情中涨幅最大、上升持续时间最长的阶段。2024年&#xff0c;云与AI深度融合形成了数字经济主升浪&#xff0c;从而打开了中国服务器操作系统的黄金机遇期。 2024年注定将成为非常不平凡的一年。不仅是实现“十四五”规划目标任务的关键一年&#x…...

STM32快速复习(九)RTC时钟模块

文章目录 前言一、RTC是什么&#xff1f;RTC的工作原理&#xff1f;二、库函数以及示例1.标准库函数2.示例代码 总结 前言 STM32 的实时时钟&#xff08;RTC&#xff09;是一个独立的定时器。 STM32 的 RTC 模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xf…...

Nacos注册中心与OpenFeign远程调用

文章目录 一、注册中心原理二、Nacos注册中心三、服务注册四、服务发现五、OpenFeign 一、注册中心原理 在微服务当中必须有两个角色 服务提供者&#xff1a;提供接口供其它微服务访问 服务消费者&#xff1a;调用其它微服务提供的接口 在大型微服务项目中&#xff0c;服务提供…...

【基础算法总结】双指针

目录 一&#xff0c;双指针算法介绍二&#xff0c;算法原理和代码实现283.移动零1089.复写零202.快乐数11.盛最多水的容器611.有效三角形的个数LRC179.和为s的两个数15.三数之和18.四数之和 三&#xff0c;算法总结 一&#xff0c;双指针算法介绍 双指针算法是基础算法之一&am…...

教你制作一本一对一授权才能阅读的样本册

在这个信息时代&#xff0c;保护个人隐私变得越来越重要。一对一授权阅读机制&#xff0c;正是为了满足这一需求而诞生。今天&#xff0c;就让我来教你如何制作一本只有一对一授权才能阅读的样本册。这不仅适用于保护个人隐私&#xff0c;还能为企业、研究机构等提供安全、高效…...

【DEV工具-IDEA】idea的光标变成黑块了?

项目场景&#xff1a; 解决&#xff1a;windows&#xff1a;按一下insert键。...

没通过算法备案 或许是这几点你没做好

没通过算法备案 或许是这几点你没做好 当企业提交算法备案遭遇“不予通过”时&#xff0c;往往是因为一些看似微小却至关重要的细节未能达到标准。以下是一些常见的原因&#xff0c;希望能为准备备案的企业提供一些预警和指导&#xff1a; ICP备案缺失&#xff1a;互联网信息服…...

Onekey Steam Depot清单下载器:3分钟快速获取Steam游戏配置文件的终极指南 [特殊字符]

Onekey Steam Depot清单下载器&#xff1a;3分钟快速获取Steam游戏配置文件的终极指南 &#x1f680; 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 还在为复杂的Steam游戏清单获取流程而烦恼吗…...

OpenClaw移动端适配:Qwen3-14b_int4_awq通过Termux在安卓手机运行

OpenClaw移动端适配&#xff1a;Qwen3-14b_int4_awq通过Termux在安卓手机运行 1. 为什么要在手机上部署OpenClaw&#xff1f; 去年夏天的一个深夜&#xff0c;我正躺在沙发上刷手机&#xff0c;突然接到一个紧急需求&#xff1a;需要立即处理一批文件并生成报告。当时手边没有…...

Foxmail最新版在macOS Sonoma的坑我都踩过了:邮件同步失败的终极修复指南

Foxmail在macOS Sonoma的深度优化指南&#xff1a;从协议解析到系统级修复 升级到macOS Sonoma后&#xff0c;许多Foxmail用户发现原本稳定的邮件同步功能突然变得不可靠。这并非简单的软件bug&#xff0c;而是系统底层架构调整与邮件客户端交互方式改变共同作用的结果。本文将…...

5大核心功能驱动管理工具:DriverStore Explorer高效清理与深度优化指南

5大核心功能驱动管理工具&#xff1a;DriverStore Explorer高效清理与深度优化指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer DriverStore Explorer&#xff08;RAPR&#xff09;是…...

Qwen-Image-Edit-F2P结合YOLOv8实现智能人像编辑:目标检测应用案例

Qwen-Image-Edit-F2P结合YOLOv8实现智能人像编辑&#xff1a;目标检测应用案例 你有没有想过&#xff0c;给照片里的人换个发型、加副眼镜&#xff0c;或者换个背景&#xff0c;能有多简单&#xff1f;过去这可能需要专业的设计师&#xff0c;花上不少时间在Photoshop里一点点…...

忍者像素绘卷开源镜像实操:从Docker拉取到RPG式交互全记录

忍者像素绘卷开源镜像实操&#xff1a;从Docker拉取到RPG式交互全记录 1. 环境准备与快速部署 在开始使用忍者像素绘卷之前&#xff0c;我们需要先准备好运行环境。这个镜像基于Docker容器技术&#xff0c;可以在大多数现代操作系统上运行。 1.1 系统要求 操作系统&#xf…...

Janus-Pro-7B行业解决方案:法律合同截图识别+条款摘要生成

Janus-Pro-7B行业解决方案&#xff1a;法律合同截图识别条款摘要生成 1. 项目背景与价值 在日常法律工作中&#xff0c;律师和法务人员经常需要处理大量的合同文档。很多时候&#xff0c;这些合同是以图片形式存在的——可能是扫描件、手机拍摄的照片&#xff0c;或是从其他系…...

CSS如何避免浮动元素换行_计算所有浮动元素的总宽度不超过父容器宽度

浮动元素换行是因子元素总宽度&#xff08;含padding、border、margin&#xff09;超过父容器可用宽度&#xff0c;导致最后一个被挤至下一行&#xff1b;这是float原始行为&#xff0c;非bug&#xff0c;需用box-sizing:border-box、flex布局等规避。浮动元素换行是因为父容器…...

有能力的已经在投了:这一批AI公司,正在悄悄招人

导读很多人还在盯着互联网大厂&#xff0c;反复刷岗位、反复改简历。但另一批人&#xff0c;已经把简历投向了另一条线——人工智能公司、机器人公司、智能制造公司。这些公司有一个共同点&#xff1a;岗位不多&#xff0c;但含金量极高要求更高&#xff0c;但成长速度更快很多…...

OpenClaw邮件处理方案:Qwen2.5-VL-7B自动分类与回复

OpenClaw邮件处理方案&#xff1a;Qwen2.5-VL-7B自动分类与回复 1. 为什么需要邮件自动化助手 每天早晨打开邮箱时&#xff0c;面对堆积如山的未读邮件总让人心生畏惧。作为技术从业者&#xff0c;我的收件箱里混杂着技术订阅、会议邀请、账单通知和各种推广信息&#xff0c;…...