计数排序算法

news2024/11/18 22:42:30

计数排序

计数排序说明:

计数排序(Counting Sort)是一种非比较性的排序算法,它通过统计元素出现的次数,然后根据元素出现的次数将元素排列在正确的位置上,从而实现排序。计数排序适用于非负整数或者具有确定范围的元素排序,其核心思想是利用一个辅助的计数数组来统计元素出现的次数,并根据次数将元素放置到正确的位置。

以下是计数排序的详细算法原理:

  1. 找到最大值:首先,我们需要遍历待排序的数组,找到其中的最大值,假设最大值为 k。
  2. 创建计数数组:接下来,我们创建一个长度为 k+1 的计数数组 count,并将数组中所有元素初始化为 0。计数数组的索引范围是 0 到 k,每个索引对应一个待排序元素的值。
  3. 统计元素出现次数:遍历待排序的数组,统计每个元素出现的次数,并将统计结果存储在计数数组 count 中。例如,如果数组中有两个元素的值都是 3,那么 count[3] 的值将变为 2。
  4. 计算累加次数:遍历计数数组 count,计算每个元素在排序后的数组中的累加次数。累加次数表示小于或等于当前元素值的元素个数。具体计算方法是通过累加前一个元素的次数得到当前元素的累加次数。这样,count[i] 就表示在排序后的数组中,小于或等于元素 i 的元素个数。
  5. 排序:创建一个与待排序数组相同长度的临时数组 sortedArr,用于存储排序结果。然后,遍历待排序数组,根据计数数组 count 中对应元素的累加次数,将每个元素放到正确的位置上。具体做法是找到当前元素在排序后数组中的索引位置,将其放入 sortedArr 数组的相应位置。同时,更新计数数组 count 中对应元素的累加次数,使其减少 1。这样,相同元素的相对顺序会保持不变。
  6. 完成排序:当遍历完待排序数组后,sortedArr 中就存储了排好序的结果。

计数排序是一种稳定的排序算法,因为相同元素的相对顺序不会改变。它适用于非负整数或者具有确定范围的元素排序,且时间复杂度为 O(n + k),其中 n 是元素个数,k 是待排序元素的最大值。

图解演示:

在这里插入图片描述

当使用计数排序时,需要注意以下几点情况:
  1. 计数排序适用于非负整数或者具有确定范围的元素排序。如果待排序的元素包含负数,计数排序不适用。
  2. 计数排序的时间复杂度为 O(n + k),其中 n 是元素个数,k 是待排序元素的最大值。当元素个数 n 较大,且最大值 k 较小时,计数排序是一个高效的排序算法。但如果 k 过大,导致计数数组非常庞大,可能会造成内存的浪费。
  3. 计数排序是稳定的排序算法,相同元素的相对顺序在排序后保持不变
下面是使用 Go 语言实现计数排序的代码示例:
package main

import "fmt"

func countingSort(arr []int) []int {
    // 找到最大值,确定计数数组的长度
    max := arr[0]
    for _, num := range arr {
        if num > max {
            max = num
        }
    }

    // 创建计数数组并统计元素出现次数
    count := make([]int, max+1)
    sortedArr := make([]int, len(arr))
    for _, num := range arr {
        count[num]++
    }

    // 计算累加次数
    for i := 1; i <= max; i++ {
        count[i] += count[i-1]
    }

    // 排序并构建 sortedArr
    for i := len(arr) - 1; i >= 0; i-- {
        sortedArr[count[arr[i]]-1] = arr[i]
        count[arr[i]]--
    }

    return sortedArr
}

func main() {
    arr := []int{4, 2, 2, 8, 3, 3, 1}
    fmt.Println("Unsorted array:", arr)

    arr = countingSort(arr)
    fmt.Println("Sorted array:", arr)
}

在这个示例中,我们使用计数排序对列表 [4, 2, 2, 8, 3, 3, 1] 进行排序。根据元素范围较小(最大值为 8)且元素均为非负整数,计数排序是一个合适的选择。

总的来说,计数排序适用于非负整数或具有确定范围的元素排序,且适用于元素范围较小、均匀分布的情况。如果待排序元素范围较大或者元素分布不均匀,计数排序可能不是最优选择。在实际使用时,应根据数据的特点来选择合适的排序算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/816136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用vue creat搭建项目

一、查看是否安装node和npm&#xff08;显示版本号说明安装成功&#xff09; node -v npm -v 显示版本号说明安装成功&#xff0c;如果没有安装&#xff0c;则需要先安装。 二、安装vue-cli脚手架 查看安装的版本&#xff08;显示版本号说明安装成功&#xff09; vue -V 三…

纯JS+Vue实现一个仪表盘

在使用canvas的时候发现数值变化&#xff0c;每次都要重新渲染&#xff0c;值都从0开始&#xff0c;这和我的需求冲突。 1. 先绘制基本的圆环背景&#xff0c;利用border-color和border-radius将正方形变成基本的圆环。 <div class"circle"><div class&qu…

使用toad对数据进行分箱处理

Toad 是专为工业界模型开发设计的Python工具包&#xff0c;特别针对评分卡的开发。Toad 的功能覆盖了建模全流程&#xff0c;从 EDA、特征工程、特征筛选到模型验证和评分卡转化。Toad 的主要功能极大简化了建模中最重要最费时的流程&#xff0c;即特征筛选和分箱。 导入模型包…

7 网络通信(上)

文章目录 网络通信概述ip地址ip的作用ip地址的分类私有ip 掩码和广播地址 linux 命令&#xff08;ping ifconfig&#xff09;查看或配置网卡信息&#xff1a;ifconfig(widows 用ipconfig)测试远程主机连通性&#xff1a;ping路由查看 端口端口是怎样分配的知名端口动态端口 查看…

思维导图在线生成,新手必备!

思维导图是一个很好的学习和工作的方式&#xff0c;可以解决我们工作中的很多困难的问题&#xff0c;但是现在随着思维导图学习方法的推广&#xff0c;市面上的导图软件层出不穷&#xff0c;电子化的思维导图软件极大的方便了我们的工作和生活&#xff0c;下面我们就一起来盘点…

Linux下Pycharm安装

查看java版本&#xff0c;如果没有安装&#xff0c;需要先安装Java JDK。 java -versionsudo apt install openjdk-11-jre-headless下载Pycharm社区般&#xff0c;安装。 tar -zxvf pycharm-community-2023.2.tar.gz sh /opt/software/pycharm-community-2023.2/bin/pycharm.s…

URL存储解锁数据管理的新思路,重新定义数据传输与共享(@vue/repl)

Thinking系列&#xff0c;旨在利用10分钟的时间传达一种可落地的编程思想。 近日&#xff0c;在了解 vue/repl 相关内容&#xff0c;其通过 URL 进行数据存储&#xff0c;感觉思路惊奇&#xff0c;打开了新方式。 首先&#xff0c;通过 URL 存储最大的便利是&#xff1a;无需服…

IDEA中连接虚拟机 管理Docker

IDEA中连接虚拟机 管理Docker &#x1f4d4; 千寻简笔记介绍 千寻简笔记已开源&#xff0c;Gitee与GitHub搜索chihiro-notes&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;且是用了精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对你有帮…

android 如何分析应用的内存(十三)——perfetto

android 如何分析应用的内存&#xff08;十三&#xff09; 本篇文章是native内存的最后一篇文章——perfetto perfetto简介 从2018年始&#xff0c;android开发者峰会正式推出perfetto工具。从此perfetto成为安卓最重要的工具之一。在2018年以前&#xff0c;android使用syst…

率失真优化

文章目录 率失真优化率失真优化技术率失真理论1.互信息量2.失真度3.率失真函数4.率失真信源编码定理 视频编码中的率失真优化1.视频失真测度2.视频率失真曲线3.视频编码率失真优化 率失真优化 编码比特率和失真度相互制约、相互矛盾 因此&#xff0c;视频编码的主要目的就是在…

浅析Java中的内存泄漏

浅析Java中的内存泄漏 Java最明显的一个优势就是它的内存管理机制。你只需简单创建对象&#xff0c;java的垃圾回收机制负责分配和释放内存。然而情况并不像想像的那么简单&#xff0c;因为在Java应用中经常发生内存泄漏。 本教程演示了什么是内存泄漏&#xff0c;为什么会发生…

CAN转ETHERCAT网关can协议是什么意思

大家好&#xff0c;今天要跟大家分享一款自主研发的通讯网关&#xff0c;JM-ECT-CAN。这款产品能够将各种CAN总线和ETHERCAT网络连接起来&#xff0c;实现高效的数据传输和通信。那么&#xff0c;这款通讯网关具体有哪些功能和特点呢&#xff1f;接下来&#xff0c;我们就一起来…

vscode配置c++环境

第一步&#xff1a;安装vscode编辑器 预先安装&#xff1a; vscode&#xff08;https://code.visualstudio.com/&#xff09;在vscode中安装 C/C extension for VS Code&#xff08;在左侧扩展栏中搜索 “C”&#xff09; 第二步&#xff1a;安装MinGW-w64工具链 MinGW 提供…

web浏览器脚本的调试

水一贴。 在浏览器中按F12点击"source"或者"源程序"点击html、js、css等源码文件所在的窗口的左边&#xff0c;此时点击处显示为蓝色光标&#xff0c;表示断点中断已经设置完毕。配合窗口右上角的"继续" “下一步” "跳过"等控制按钮…

计算机SCI期刊,和计算机会议哪个更权威? - 易智编译EaseEditing

在计算机学科领域&#xff0c;SCI期刊和计算机会议都有其特点和优势&#xff0c;但两者在权威性方面可能存在一些差异。 SCI期刊是指被SCI&#xff08;Science Citation Index&#xff09;收录的学术期刊&#xff0c;SCI是Web of Science&#xff08;科学引文索引&#xff09;的…

[内测招募] IDEA 插件 X-ChatGPT 内测预览版 支持自定义 ChatGPT 回调函数 释放 AI 的无限可能性

X-ChatGPT 独创的 [项目感知] 功能 打造更精准、更智能、更懂你 的专属 ai 编程助手 这个插件是一款基于开源项目 ChatGPT-Next-Web的 IntelliJ IDEA 平台的插件 价格 &#xff1a;免费、速率限制 每小时/100 次/ip 使用方式 &#xff1a;在 IDEA 插件商店中搜索 X-ChatGPT…

信号三表block,pending、handler

目录 前序&#xff1a; 信号流程图&#xff1a; pending表&#xff08;信号未决表 block表&#xff08;信号阻塞表 handler表&#xff08;信号递达表 小知识点 1&#xff1a;handler保存的是什么 前序&#xff1a; 进程信号中的三大表格 首先在了解进程信号中的三大表格…

SpringBoot Aop进行身份验证

忘了好复制&#x1f923; 创建一个注解&#xff0c;可以应用于类或者方法上的&#xff0c;进行表示身份认证。 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) public interface VerifyLogin { }定义一个没有登录的异常和全局异常处理器…

找样机素材,就上这5个网站,免费下载~

设计师经常需要用到各种样机模型来展示直接的作品&#xff0c;今天我就分享几个可以免费下载样机模型的网站&#xff0c;大家赶紧收藏起来&#xff01; 菜鸟图库 https://www.sucai999.com/searchlist/3217.html?vNTYxMjky 菜鸟图库有多种类型的设计素材&#xff0c;像平面、…

fiddler过滤器

1、fiddler Fiddler是一个免费、强大、跨平台的HTTP抓包工具。下载地址 2、为什么适用过滤器 不适用过滤器时&#xff0c;所有的报文都会被抓包。 我们在开发或测试时&#xff0c;只需要抓包某个域名下的报文 &#xff0c;以“www.baidu.com”为例&#xff0c;不设置过滤器&…