欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 数据结构之计数排序算法【图文详解】

数据结构之计数排序算法【图文详解】

2024/10/25 12:23:48 来源:https://blog.csdn.net/LiU11e/article/details/139549848  浏览:    关键词:数据结构之计数排序算法【图文详解】
P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。
P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

  

在这里插入图片描述

                                           博主主页:LiUEEEEE
                                              C语言专栏
                                            数据结构专栏
                                         力扣牛客经典题目专栏

目录

  • 1、计数排序的基本思想
  • 2、计数排序的思想过程
  • 3、计数排序的优化
  • 4、优化后的计数排序完整代码展示
  • 5、结语

1、计数排序的基本思想


  计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。

  操作步骤:

  1. 统计相同元素出现次数
  2. 根据统计的结果将序列回收到原来的序列中




2、计数排序的思想过程


  现有示例数组,成员为2,5,3,0,2,3,0,3。

在这里插入图片描述
  通过直接观察我们可知数组中A最大元素为5,最小为0,故我们直接另开辟一个大小为六个整形的数组B,并通过calloc直接对数组B进行初始化为0。
在这里插入图片描述
  而后使用变量 i 对数组A进行遍历,然后让数组B中下标为A[ i ]位置的数值加一,及如上所示。
  而后继续遍历,直到遍历到数组A结束,如下所示。
在这里插入图片描述  在遍历结束后,数组B中所存数值为其下标数字在数组A中出现的次数,因为下标顺序本就是有序,故可直接按照其下标顺序进行对数组A的数值覆盖,当遇到下标所在位置为0时直接略过,即如下所示:
在这里插入图片描述  此时数组A就是在原数组基础上的有序数组了,记得释放动态开辟出的空间数组B哦。




3、计数排序的优化


  上文中展示了有限数组的计数排序方法,那如果所给数组个数未知,且数组元素差值远远小于所给数组元素的个数(例如10000个元素的数组中,最大值为9999,最小值为9990),那我们所开辟的动态数组就可不必开辟10000个整型变量的大小,只需开辟(最大值 - 最小值 + 1 )个整型变量大小即可,因为其中的元素不同的个数仅有10个。




4、优化后的计数排序完整代码展示


  完整代码如下所示
#include <stdio.h>
#include <stdlib.h>void CountSort(int* a, int n)
{int max = a[0];int min = a[0];for (int i = 0; i < n; i++){if (max < a[i])max = a[i];if (min > a[i])min = a[i];}int range = max - min + 1;int* tmp = (int*)calloc(range, sizeof(int));if (tmp == NULL){perror("CountSort: calloc fail");return;}for (int i = 0; i < n; i++){tmp[a[i] - min]++;}int j = 0;for (int i = 0; i < range; i++){while(tmp[i]--){a[j++] = i + min;}}free(tmp);	
}void test01()
{int a[] = { 3,4,3,6,4,5,6,1,3,2,7,8,7,9,5 };int n = sizeof(a) / sizeof(a[0]);CountSort(a, n);for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");}int main()
{test01();return 0;
}




5、结语


在这里插入图片描述

  十分感谢您观看我的原创文章。
  本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
  如需引用,注明地址。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com