【数据结构】八大排序之计数排序算法

举报
修修修也 发表于 2024/09/30 16:51:55 2024/09/30
【摘要】 ​ 🦄个人主页:修修修也 🎏所属专栏:数据 结 构 ⚙️操作环境:Visual Studio 2022​编辑目录 一. 计 数排序 简 介及思想 二. 计 数排序代 码实现   三. 计 数排序复 杂 度分析 📌 时间 复 杂 度 📌 空 间 复 杂 度 结语  一.计数排序简介及思想计数排序(Counting Sort)又称为鸽巢原理,是对哈希直接定址法的变形应用.计数排序的核心在...

 

🦄个人主:修修修也

🎏所属专栏:数据

⚙️操作:Visual Studio 2022

​编辑


 一. 数排序 介及思想

二. 数排序代 码实现  

三. 数排序复 度分析

📌 时间

📌

结语


 一.数排序介及思想

数排序(Counting Sort)又称为鸽巢原理,是哈希直接定址法的.

数排序的核心在于将入的数据值转为键外开辟的数中。作一种线时间度的排序,数排序要求入的数据必是有确定范的整数。

算法动图演示如下:

​编辑

数排序的实现思路:

1. 统计每个数据出的次数

2. 按序

虽然计数排序实现思路比较简单,但我们还是有一些细节需要注意:

绝对映射和相映射:

绝对映射:如下,数据的数和数是一一对应,数方式叫做绝对映射​编辑

绝对映射的缺点:开辟数占用空,不能

映射:如下,数据在数中是按照数的相大小来映射的,数方式叫做相映射.​编辑相对映射较好的解决了绝对映射的缺点,但当遇到待排数据分布较为分散且跨度较大时,就不太适合使用计数排序来进行排序了.


二.数排序代码实现 

算法实现:(以升序)

1. 待排数,找出数中的最大max和最小min.

2. 开辟大小max-min+1大小的数用以.

3. 组计.

4. 数数记录的数据恢复到原数.

综上,计数排序的代码实现如下:

//计数排序

void CountSort(int* a, int n)

{

    int max = a[0], min = a[0];

    for (int i = 1; i < n; i++)

    {

        if (a[i] > max)

        {

            max = a[i];

        }

        if (a[i] < min)

        {

            min = a[i];

        }

    }




    int range = max - min + 1;




    int* countA = (int*)calloc(sizeof(int) , range);

    if (countA == NULL)

    {

        perror("calloc fail\n");

        return;

    }




    //计数

    for (int i = 0; i < n; i++)

    {

        countA[a[i] - min]++;//映射的下标++就行

    }




    //排序

    int j = 0;

    for (int i = 0; i < range; i++)

    {

        while (countA[i]--)

        {

            a[j++] = i + min;

        }

    }




    free(countA);

}


三.数排序复度分析

📌时间

数排序的时间度主要取决于两部分,一是前期遍找出最大和最小,里的时间n,二是遍组计,里的时间n,三是遍历计数数排序,里的时间range(即max-min),因此我通常认为,数排序的时间O(n+range);当range接近n,我可以认为计数排序的时间O(n).

📌

数排序的空度主要取决于动态开辟的数数的大小,即range,因此数排序的空O(range).


结语

 希望数排序算法解能大家有所帮助,迎大佬留言或私信与我交流.

有关更多排序相关的知可以移步:

【数据 构】八大排序算法 ​​​ https://blog.csdn.net/weixin_72357342/article/details/135038495?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135038495%22%2C%22source%22%3A%22weixin_72357342%22%7D&fromshare=blogdetail

学海漫浩浩,我亦苦作舟!关注我,大家一起学,一起!

相关文章推荐

【数据 构】八大排序之冒泡排序算法

【数据 构】八大排序之希 排序算法

【数据 构】八大排序之直接插入排序算法

【数据 构】八大排序之 简单选择 排序

【数据 构】八大排序之堆排序算法

【数据 构】八大排序之快速排序算法

【数据 构】八大排序算法之 并排序算法

【数据 构】八大排序之 数排序算法


数据构排序算法篇思维导图:​编辑


​编辑

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。