排序之计数排序

简介: 排序之计数排序

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱

ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客

本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶

个人主页:xiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客

系列专栏:xiaoxie的JAVA系列专栏——CSDN博客●'ᴗ'σσணღ*

我的目标:"团团等我💪( ◡̀_◡́ ҂)"

( ⸝⸝⸝›ᴥ‹⸝⸝⸝ )欢迎各位→点赞👍 + 收藏⭐️ + 留言📝+关注(互三必回)!

一.计数排序概念

计数排序是一种非比较性的排序算法,它的基本思想是通过统计一个数组中每个元素出现的次数,然后根据这个统计信息将数组中的元素按照顺序排列这个方法待排序数组的范围不是很大且元素都是非负整数的情况下,具有较高的排序效率。

1.过程

1.找出待排序的数组中最大和最小的元素

2.统计数组中每个值为i的元素出现的次数,存入数组C的第i项

3.对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)

4.反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

2.图解过程

如下图,A为待排序的数组,C记录A中各个值的数目。

将C[i]转换为值小于等于i的元素个数。

为数组A从后向前的每个元素找到对应的B中的位置,每次从A中复制一个元素到B中,C中相应的计数减一。

当A中的元素都复制到B中后,B就是排序好的结果,如图所示

3.代码

1.Java版本

  public static void countSort(int[] array) {
        //1.求最值 -> O(n)
        int min = array[0];
        int max = array[0];
        for (int i = 1; i < array.length; i++) {
            if(min > array[i]) {
                min = array[i];
            }
            if(max < array[i]) {
                max = array[i];
            }
        }
        //2、定义计数数组 进行初始化   -> O(n)
        int[] count = new int[max-min+1];
 
        for (int i = 0; i < array.length; i++) {
            int index = array[i]-min;
            count[index]++;
        }
 
        //3、遍历计数数组   -> O(max-min) :max-min-》范围
        int k = 0;//表示array数组的下标
        for (int i = 0; i < count.length; i++) {
            while (count[i] != 0) {
                array[k] = i + min;
                k++;
                count[i]--;
            }
        }
    }

2.C++版本

#include <iostream>
using namespace std;
 
void countSort(int array[], int n) {
    // 1. 求最值 -> O(n)
    int min = array[0];
    int max = array[0];
    for (int i = 1; i < n; i++) {
        if (min > array[i]) {
            min = array[i];
        }
        if (max < array[i]) {
            max = array[i];
        }
    }
 
    // 2、定义计数数组 进行初始化   -> O(n)
    int count[max - min + 1] = {0};
 
    for (int i = 0; i < n; i++) {
        int index = array[i] - min;
        count[index]++;
    }
 
    // 3、遍历计数数组   -> O(max - min)
    int k = 0; // 表示array数组的下标
    for (int i = 0; i < count.size(); i++) {
        while (count[i] != 0) {
            array[k] = i + min;
            k++;
            count[i]--;
        }
    }
}
 

4.时间复杂度

计数排序的时间复杂度为O(n+k),其中n是待排序数组的大小,k是待排序数组中的最大值减最小值加1(即数组的取值范围)。计数排序的时间复杂度是线性的,不受待排序数组的分布情况的影响。但是,计数排序只适用于整数排序且取值范围不大的情况,对于较大范围的整数排序,计数排序的空间复杂度会较高,不适用于大规模数据的排序。

5.空间复杂度

计数排序的空间复杂度为 O(k),其中 k 是输入数组中不同数值的最大值与最小值之差加一,即 k = max - min + 1。在上述代码实现中,用于存储计数的数组 count 的大小就是 max - min + 1。

另外,在实际实现中,如果输入数组非常大而数值范围相对较小,空间复杂度上的这个 k 可能远小于 n(输入数组的长度),因此相比于原数组大小 n,计数排序的空间需求可能较低。但如果数值范围与数组长度相近或更大时(即 k ≈ n 或 k > n),则空间复杂度接近于 O(n)。

6.稳定性

稳定的排序

感谢你的阅读

 

 

 


相关文章
|
API 开发工具 数据安全/隐私保护
蚂蚁开放平台 ✖️ 授权管理
为保障数据安全,开放平台要求开发者调用能力时使用有效令牌(token)进行身份验证。请勿泄露或暴露令牌信息。开发者可登录平台添加、复制、删除或切换令牌状态,调用时需将token添加至请求头Authorization参数。每种类型令牌最多10个。
685 0
|
6月前
|
存储 关系型数据库 BI
数据架构是什么?数据架构有几个层次?
本文通俗解析企业数据架构五大核心层次:数据源(起点)、存储(仓库)、处理(厨房)、服务(快递站)、应用(餐桌),厘清每层职责、技术选型与协同逻辑,助企业摆脱数据混乱困局,构建可演进、易维护的数据管理体系。
|
6月前
|
机器学习/深度学习 自然语言处理 搜索推荐
大模型应用:从粗排到大模型生成:交叉熵、余弦重排序的全流程实践.97
本文系统阐述检索排序“粗排→算法精排(交叉熵/余弦重排序)→大模型生成”三级架构,强调80%检索质量由排序算法决定:粗排快速召回,精排精准打分,重排序提升多样性,大模型仅负责最终润色与个性化生成,实现高效协同。
468 0
|
7月前
|
缓存 安全 数据安全/隐私保护
CCleaner安装与使用教程 Windows版:解压+管理员运行启动指南
CCleaner是一款高效系统优化与隐私保护工具,可清理垃圾文件、无效注册表及浏览器缓存,提升运行速度、保障隐私安全。本文详解下载、解压、管理员运行及启动验证步骤,助您快速上手使用。(239字)
|
9月前
|
人工智能 算法 架构师
AI Agent 职业路线全解析:从入门到专家的进阶指南
大模型正进化为能自主感知、规划、执行的AI Agent。AI Agent工程师需掌握思维设计、记忆管理、工具调用等核心能力,职业路径分原型落地、企业级方案、领域专家三阶段,是人机交互升级与垂直领域溢价的长青赛道。(239字)
629 1
|
机器学习/深度学习 人工智能 搜索推荐
|
SQL 人工智能 安全
深度复盘MCP安全风暴:一个工单如何演变成数据库“特洛伊木马”危机?
近期,安全公司 General Analysis 披露的MCP安全漏洞在技术圈引发了巨大震动。这个"特洛伊木马"式的安全漏洞暴露了一个现实:AI时代,传统的数据库访问方式已经无法满足安全需求。阿里云数据管理DMS新推出的DMS MCP Server,正是为AI时代的数据库安全访问而生,它不仅完美解决了传统MCP的安全隐患,更为企业提供了一个安全、智能、高效的数据访问新范式。
995 5
|
前端开发 Java 开发者
深入理解 Spring Boot 注解:核心功能与高级用法详解
深入理解 Spring Boot 注解:核心功能与高级用法详解
2204 1
|
弹性计算 安全 Java
阿里云服务器配置、(xshell)远程连接、搭建环境、设置安全组、域名备案、申请ssl证书
以下是内容的摘要: 在阿里云购买服务器并进行基本配置的步骤如下: 1. **准备工作**: - 注册阿里云账号:访问阿里云官网并注册新账号,输入用户名、手机号和验证码。 - 实名认证:在个人中心进行实名认证,建议选择企业实名,因为个人实名可能无法索取企业发票。

热门文章

最新文章