惊叹数据结构之美,品味排序算法之妙:对计排、桶排的详细介绍

惊叹数据结构之美,品味排序算法之妙:对计排、桶排的详细介绍
大家好,这里是小编的博客频道
小编的博客:就爱学编程
很高兴在ZEEKLOG这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!

本文目录


引言

排序算法中的基数排序和计数排序都是非基于传统比较的排序方法,它们各自有着独特的实现原理和应用场景。下面小编将从代码实现的角度对这两种排序算法进行详细介绍。

在这里插入图片描述

那接下来就让我们开始遨游在知识的海洋!

正文


一、计数排序(Counting Sort)

原理概述

计数排序是一种适用于元素范围较小的排序算法。它利用一个额外的计数数组来记录待排序数组中每个元素出现的次数,然后根据这些次数来确定每个元素在最终排序数组中的位置。

代码实现步骤

1. 确定元素范围:找出待排序数组中的最小值和最大值,记为min和max。2. 创建计数数组:创建一个大小为max-min+1的计数数组count,用于记录每个元素出现的次数。数组的下标代表元素的值,数组的值代表该元素出现的次数。3. 统计频次:遍历待排序数组,统计每个元素出现的频率,并将该频率存储到计数数组中。4. 累计计数:将计数数组中的值进行累加,得到每个元素在最终排序数组中的位置。这个步骤确保了排序的稳定性(即相同元素的相对位置不变)。5. 构造排序结果:根据累加后的计数数组,将元素按顺序放入目标排序数组中。

示例代码

#include<iostream>usingnamespace std;int*count_sort(int* input,int len,int min,int max){int* arr =newint[max - min +1];// 创建计数数组for(int i =0; i < max - min +1; i++) arr[i]=0;// 初始化计数数组为0// 统计每个元素的出现次数for(int i =0; i < len; i++){ arr[input[i]- min]++;}int* ans =newint[len];// 创建目标排序数组int index =0;// 用于填充目标排序数组的索引// 根据计数数组构建目标排序数组for(int i = min; i <= max; i++){for(int j =0; j < arr[i - min]; j++){ ans[index++]= i;}}return ans;// 返回排序后的数组}intmain(){int arr[]={3,6,4,5,6,3,6,4,5,5,6,4,3};int len =sizeof(arr)/sizeof(int);int* sorted_arr =count_sort(arr, len,3,6);// 输出排序结果for(int i =0; i < len; i++){ cout << sorted_arr[i]<<" ";} cout << endl;delete[] sorted_arr;// 释放动态分配的内存return0;}

二、基数排序(Radix Sort)

原理概述

基数排序又称桶排序,它通过将所有数字分配到应在的位置最后再覆盖到原数组完成排序的过程。基数排序分为最高位优先法(MSD)和最低位优先法(LSD)。这里以最低位优先法为例进行说明。
基数排序的基本思想是从数字的最低有效位开始,依次对每个数位进行一次排序。每次排序都使用稳定的排序算法(如计数排序),以保证排序后元素的相对位置不变。经过多次排序后,整个数列就变得有序了。

代码实现步骤

1. 获取最大位数:找出待排序数组中所有数字的最大位数。2. 逐位排序:从最低有效位开始,依次对每个数位进行排序。每次排序都使用计数排序算法。3. 合并结果:由于每次排序都是稳定的,所以可以直接在原数组上进行操作,无需额外的合并步骤。

示例代码(以最低位优先法为例):

#include<iostream>#include<vector>#include<algorithm>#include<cmath>usingnamespace std;// 获取数字d在第pos位的值(0~9)intgetDigit(int d,int pos){return(d /static_cast<int>(pow(10, pos)))%10;}// 对数组arr按照第pos位进行计数排序voidcountingSortByDigit(vector<int>& arr,int pos){constint radix =10;// 基数为10(因为是十进制数) vector<int>output(arr.size());// 存储排序结果的数组 vector<int>count(radix,0);// 计数数组// 统计每个数字在第pos位上出现的次数for(int num : arr){int digit =getDigit(num, pos); count[digit]++;}// 修改count数组,使其包含实际位置信息for(int i =1; i < radix; i++){ count[i]+= count[i -1];}// 构建输出数组for(int i = arr.size()-1; i >=0; i--){int digit =getDigit(arr[i], pos); output[count[digit]-1]= arr[i]; count[digit]--;}// 将排序结果复制回原数组copy(output.begin(), output.end(), arr.begin());}// 基数排序主函数voidradixSort(vector<int>& arr){if(arr.empty())return;// 找到最大数的位数int maxNum =*max_element(arr.begin(), arr.end());int maxDigits =log10(maxNum)+1;// 从个位开始,逐位进行计数排序for(int pos =0; pos < maxDigits; pos++){countingSortByDigit(arr, pos);}}intmain(){ vector<int> arr ={170,45,75,90,802,24,2,66};radixSort(arr);// 输出排序结果for(int num : arr){ cout << num <<" ";} cout << endl;return0;}

三、总结

  • 计数排序:适用于元素范围较小的情况,时间复杂度为O(n+k),其中n是待排序元素的个数,k是元素的范围。空间复杂度高,需要额外的计数数组。
  • 基数排序:通过逐位排序来实现整体排序,通常使用计数排序作为子过程。时间复杂度为O(d*(n+r)),其中d是数字的最大位数,n是待排序元素的个数,r是基数(对于十进制数,r=10)。基数排序是稳定的排序算法。

快乐的时光总是短暂,咱们下篇博文再见啦!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!!

Read more

【DeepSeek应用】100个 DeepSeek 官方推荐的工具箱

【DeepSeek应用】100个 DeepSeek 官方推荐的工具箱

【DeepSeek应用】Deepseek R1 本地部署(Ollama+Docker+OpenWebUI) 【DeepSeek应用】DeepSeek 搭建个人知识库(Ollama+CherryStudio) 【DeepSeek应用】100个 DeepSeek 官方推荐的工具箱 【DeepSeek应用】Zotero+Deepseek 阅读与分析文献 【DeepSeek应用】100个 DeepSeek 官方推荐的工具箱 * 1. DeepSeek 工具箱:应用程序 * 2. DeepSeek 工具箱:AI Agent 框架 * 3. DeepSeek 工具箱:RAG 框架 * 4. DeepSeek 工具箱:即时通讯软件 * 5. DeepSeek 工具箱:浏览器插件 * 6. DeepSeek 工具箱:

By Ne0inhk
“现在的AI就像1880年的笨重工厂!”微软CSO斯坦福泼冷水:别急着造神

“现在的AI就像1880年的笨重工厂!”微软CSO斯坦福泼冷水:别急着造神

大模型仍未对上商业的齿轮? 编译 | 王启隆 来源 | youtu.be/aWqfH0aSGKI 出品丨AI 科技大本营(ID:rgznai100) 现在的硅谷,空气里都飘着一股“再不上车就晚了”的焦躁感。 最近 OpenClaw 风头正旺,强势登顶 GitHub,终结了 React 神话,许多人更是觉得“AI 自己干活赚钱”的日子就在明天了。 特别是在斯坦福商学院(GSB)这种地方,台下坐着的都是成天琢磨怎么用下一个技术风口搞个独角兽出来的狠人。 微软的首席科学官(CSO)Eric Horvitz 被请到了这个几乎全美最想用 AI 变现的礼堂里。作为从上世纪 80 年代就开始搞 AI 的绝对老炮、也是微软技术底座的“扫地僧”,这位老哥并没有顺着台下的胃口,去吹捧下个月大模型又要颠覆什么行业,而是兜头给大家浇了一盆带点学术味的冷水。 他讲了一个挺有画面感的比喻:大家都在聊

By Ne0inhk
Godot被AI代码“围攻”!维护者崩溃发声:“不知道还能坚持多久”

Godot被AI代码“围攻”!维护者崩溃发声:“不知道还能坚持多久”

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 当大模型能在几秒钟内生成一段“看起来像那么回事”的补丁时,开源社区却开始付出另一种代价。 最近,开源游戏引擎 Godot 的核心维护团队公开吐槽:他们正被大量“AI 生成的低质量代码”淹没。那些代码往往结构完整、注释齐全、描述洋洋洒洒,但真正的问题是——提交者可能并不理解自己交上来的内容。 这件事,并不是简单的“有人偷懒用 AI 写代码”。它正在触及开源协作最核心的东西:信任。 一场悄无声息的“AI 洪水” 事情的导火索来自一条 Bluesky 讨论帖。 Godot 主要维护者之一、同时也是 Godot 商业支持公司 W4 Games 联合创始人的 Rémi Verschelde 表示,所谓的“AI slop”

By Ne0inhk
诺奖得主辛顿最新访谈:1 万个 AI 可以瞬间共享同一份“灵魂”,这就是为什么人类注定被超越

诺奖得主辛顿最新访谈:1 万个 AI 可以瞬间共享同一份“灵魂”,这就是为什么人类注定被超越

当宇宙级的“嘴炮”遇到降维打击。 编译 | 王启隆 来源 | youtu.be/l6ZcFa8pybE 出品丨AI 科技大本营(ID:rgznai100) 打开最新一期知名播客 StarTalk 的 YouTube 评论区,最高赞的一条留言是这样写的: “我长这么大,第一次看到尼尔·德葛司·泰森(Neil deGrasse Tyson)在一档节目里几乎全程闭嘴,像个手足无措的小学生一样乖乖听讲。” 作为全美最知名的天体物理学家,泰森平时的画风是充满激情、喋喋不休、用宇宙的宏大来震撼嘉宾。但这一次,坐在他对面的那位满头银发、带着温和英音的英国老人,仅仅用最平淡的语气,就让整个演播室陷入了数次令人窒息的沉默。 这位老人是 Geoffrey Hinton。深度学习三巨头之一,2024 年诺贝尔物理学奖得主,被公认为“AI 教父”。 对经常阅读 Hinton 演讲的我来说,这也是比较新奇的一幕—

By Ne0inhk