排序之计数排序

news2024/11/27 4:30:12

꒰˃͈꒵˂͈꒱ 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.稳定性

稳定的排序

 感谢你的阅读

 

 

 

 

 

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

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

相关文章

Java基础 集合(一)Collection与Iterator Iterable迭代器详解以及集合在for循环下如何删除

目录 简介 Iterator和Iterable for循环删除问题 for-each下删除数据 解决方法 for下删除数据 解决方法 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的…

非鸿蒙官方低代码源码生成器

介绍 鸿蒙低代码可视化开发神器快速对鸿蒙ArkUI生成源码&#xff0c;结合类似小程序类似设计&#xff0c;页面设计底部菜单&#xff0c;支持宫格组件、轮播图、图文列表、图片组件、文本内容组件&#xff0c;快速对接第三方HttpApi。通过鸿蒙扩展axios扩展库加载数据源&#x…

众星素颜出镜影协大会,真实状态引发热议,陈道明备受赞誉。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 岁末之际&#xff0c;电影家协会盛大集结&#xff0c;众星璀璨…

[JAVA数据结构] 二叉树 - 详解

目录 (一) 树形结构 1. 树的概念与结构 2. 树的表示形式 (二) 二叉树 1. 二叉树的概念 2. 两种特殊的二叉树 3. 二叉树的性质 4. 二叉树的存储 5. 二叉树的遍历 (1) 前序遍历 (2)中序遍历 (3)后序遍历 6. 二叉树的基本操作 - 模拟实现 (一) 树形结构 1. 树的概念与…

机器学习算法决策树

决策树的介绍 决策树是一种常见的分类模型&#xff0c;在金融风控、医疗辅助诊断等诸多行业具有较为广泛的应用。决策树的核心思想是基于树结构对数据进行划分&#xff0c;这种思想是人类处理问题时的本能方法。例如在婚恋市场中&#xff0c;女方通常会先询问男方是否有房产&a…

c/c++静态字符串的基本操作

文章目录 1.串的定义2. 赋值操作3.字符串复制操作4.判断空5.比较操作6.求串的长度7.打印全部元素8.求字串9.串拼接10.清空操作11.源代码 在本篇博客中&#xff0c;定义的字符串为索引1为起始下标。 1.串的定义 #define MAXLEN 255 //预定义最大串长255 typedef struct {char …

从[redis:LinkedList]中学习链表

文章目录 adlistlistNodelistmacros[宏定义]listCreatelistInitNodelistEmptylistReleaselistAddNodeHeadlistLinkNodeHeadlistAddNodeTaillistLinkNodeTaillistInsertNodelistDelNodelistUlinkNodelistIndexredis3.2.100quicklistredis7.2.2quicklist redis的基本数据类型之一…

【代码随想录】LC 77. 组合

文章目录 前言一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、代码详解 前言 本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记&#xff0c;如有侵权&#xff0c;立即删除。 一、题目 1、原题链接 77. 组合 2、题目描述 二、解题报告 1、思路分析 &#x…

C++类和对象(中)六个默认成员函数

&#x1f308;类的六个默认成员函数 任何一个类&#xff0c;不管是否为空&#xff0c;都会在生成的时候默认调用六个成员函数&#xff0c;这些成员函数可以自动生成&#xff0c;也可以由程序员写出。这六个默认成员函数分别是&#xff1a; 最主要的是前四个&#xff1a; 初始…

2-树-恢复二叉搜索树

这是树的第二篇算法&#xff0c;力扣链接。 给你二叉搜索树的根节点 root &#xff0c;该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下&#xff0c;恢复这棵树 。 示例 1&#xff1a; 输入&#xff1a;root [1,3,null,null,2] 输出&#xff1a;[3,1,null,…

Google Gemini Pro 国内版

Google Gemini Pro 国内版&#xff1a;【直达链接】 Google Gemini Pro 国内版 能力分类基准测试描述更高分数更好Gemini UltraGPT-4通用MMLU57个主题&#xff08;包括STEM、人文等&#xff09;的问题表示是90.0%86.4%&#xff08;5-shot, 报告&#xff09;推理Big-Bench Hard…

linux系统上C程序的编译、运行及调试-gcc

gcc -o timer timer.c &#xff1a;生成可执行文件main&#xff0c;依托main.c,也可依托多个文件./timer :运行代码

C# 根据USB设备VID和PID 获取设备总线已报告设备描述

总线已报告设备描述 DEVPKEY_Device_BusReportedDeviceDesc 模式 winform 语言 c# using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Window…

【软件设计师笔记】计算机系统基础知识考点

&#x1f413; 计算机系统组成 计算机系统是由硬件和软件组成的&#xff0c;它们协同工作来运行程序。计算机的基本硬件系统由 运算器、控制器、存储器、输入设备和输出设备5大部件组成。运算器、控制器等部件被集成 在一起统称为中央处理单元&#xff08;Central Processing …

幻兽帕鲁服务器怎么更新?教你一行命令搞定!

今天发现幻兽帕鲁又进行了一次更新&#xff0c;所以我们的服务器也是需要同步更新的 那么&#xff0c;我们通过阿里云或腾讯云一键部署的幻兽帕鲁服务器怎么更新呢&#xff1f; 腾讯云轻量云一键部署幻兽帕鲁服务器教程&#xff1a;https://curl.qcloud.com/pzBO9wN7 先来讲…

短视频去水印教程,免费一键获取视频、图片、文案【迅风去水印】

自媒体行业的蓬勃发展&#xff0c;让越来越多的创作者涌入其中。然而&#xff0c;剪辑过程中常常遭遇到一个令人头疼的问题&#xff0c;那就是视频或图片上的水印。这些水印不仅会影响到作品的美感&#xff0c;还可能侵犯到版权。为了帮大家解决这一难题&#xff0c;分享一个免…

HTML 样式学习手记

HTML 样式学习手记 在探索网页设计的世界时&#xff0c;我发现HTML元素的样式调整真的是个很酷的环节。通过简单的属性设置&#xff0c;就能让文字换上五彩斑斓的颜色、变换各异的字体和大小。特别是那个style属性&#xff0c;感觉就像是一扇通往CSS魔法世界的大门。 代码小试…

uniapp微信小程序触底加载(超简单)

你在哪个页面需要就给他在page.json里面填写以下代码&#xff0c;表示距离底部还有50px就触发 1.page.json添加以下代码 "onReachBottonDistance":50 这是文档链接 页面 | uni-app官网 (dcloud.net.cn) 2. 页面中写以下代码 onReachBottom(e) {console.log(&quo…

【Git】01 Git介绍与安装

文章目录 一、版本控制系统二、Git三、Windows安装Git3.1 下载Git3.2 安装3.3 检查 四、Linux安装Git4.1 YUM安装4.2 源码安装 五、配置Git5.1 配置用户名和邮箱5.2 配置级别5.3 查看配置 六、总结 一、版本控制系统 版本控制系统&#xff0c;Version Control System&#xff…

Rhino 8.1下载安装教程,保姆级教程,小白也能轻松搞定,附安装包和工具

前言 Rhinoceros,又叫犀牛&#xff0c;是一款小巧强大的高级三维建模工具&#xff0c;适用于机械设计、科学工业、三维动画等广泛领域。它包含了所有的NURBS建模功能&#xff0c;用它建模感觉非常流畅&#xff0c;所以大家经常用它来建模&#xff0c;然后导出高精度模型给其他…