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

惊叹数据结构之美,品味排序算法之妙:对计排、桶排的详细介绍
大家好,这里是小编的博客频道
小编的博客:就爱学编程
很高兴在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

清华智谱开源7440亿参数的智能体GLM-5

简介 我们正式推出GLM-5,面向复杂系统工程与长周期智能体任务。规模化仍然是提升通用人工智能(AGI)智能效能的最重要途径之一。相比GLM-4.5,GLM-5将参数量从3550亿(激活320亿)扩展至7440亿(激活400亿),预训练数据从23万亿token增至28.5万亿token。GLM-5还集成了深度求索稀疏注意力机制(DSA),在保持长上下文能力的同时大幅降低部署成本。 强化学习旨在弥合预训练模型"达标"与"卓越"之间的鸿沟。然而由于RL训练效率问题,在大语言模型中规模化部署面临挑战。为此我们开发了slime——创新的异步RL基础设施,显著提升训练吞吐效率,支持更精细化的训练后迭代。得益于预训练与训练后的双重突破,GLM-5在各类学术基准测试中较GLM-4.7实现显著提升,在推理、编程和智能体任务领域达到全球开源模型顶尖水平,进一步缩小与前沿模型的差距。 基准测试 GLM-5GLM-4.7DeepSeek-V3.2Kimi K2.5Claude Opus 4.5Gemini 3 ProGPT-5.2

By Ne0inhk
《高扩展性开源智能体开发:多插件集成与优质资源编排技术落地》

《高扩展性开源智能体开发:多插件集成与优质资源编排技术落地》

前引:在 AI 技术席卷各行各业的今天,从智能客服到个性化推荐,从科研辅助到生活助手,智能体的应用场景越来越广泛。如果你也想跻身 AI 浪潮,却苦于 “入门无门、实战无路”,那么这篇教程将为你打通 “理论 + 实践” 的双路径 ——先推荐你去“AI 大学堂”免费学习 AI 基础课程,这里有 SQL 交互、TensorFlow 实战、AIGC 前沿应用等课程,能帮你快速建立 AI 知识体系;待你打好基础后,再带你深度玩转 “讯飞星辰 Agent 平台”,手把手教你搭建属于自己的智能体,让你从 “AI 学习者” 变身 “智能体创作者”! 接下来,就让我们开启这段 “先学后练” 的 AI 成长之旅吧!

By Ne0inhk

OpenClaw 最新功能大揭秘!2026年最火开源AI Agent迎来史诗级升级,手机变身AI终端不是梦

OpenClaw 最新功能大揭秘!2026年最火开源AI Agent迎来史诗级升级,手机变身AI终端不是梦 大家好,我是Maynor。最近开源社区彻底炸锅了——OpenClaw(前身Clawdbot/Moltbot)又一次刷屏!这个能真正“干活”的本地AI助手,在3月2日刚刚发布v2026.3.1版本,紧接着2月底的v2026.2.26也是里程碑式更新。 从外部密钥管理、线程绑定Agent,到Android深度集成、WebSocket优先传输……OpenClaw正在把“AI常驻员工”从概念变成现实。 今天这篇图文并茂的干货,带你一口气看懂最新功能、安装上手和实战价值!

By Ne0inhk

Docker部署iptvnator:打造家庭媒体中心的开源解决方案

Docker部署iptvnator:打造家庭媒体中心的开源解决方案 【免费下载链接】iptvnator 项目地址: https://gitcode.com/GitHub_Trending/ip/iptvnator 在数字化时代,家庭媒体中心已成为现代生活的重要组成部分。然而,许多用户面临IPTV播放不稳定、广告干扰和功能受限等问题。本文将介绍如何使用Docker部署iptvnator开源播放器,构建一个稳定、可控的IPTV服务器,实现家庭媒体中心的高效搭建。通过Docker容器化技术,即使是基础Linux知识的用户也能轻松部署和管理这一开源播放器,享受个性化的媒体体验。 IPTV媒体中心的价值与架构解析 iptvnator作为一款基于Tauri和Angular构建的开源IPTV播放器,支持m3u/m3u8播放列表格式,为用户提供了构建个人媒体中心的理想选择。其核心价值体现在三个方面:首先,开源特性确保了代码的透明度和可定制性;其次,跨平台支持让用户可以在多种设备上无缝使用;最后,丰富的功能集满足了从简单播放到高级管理的全场景需求。 系统架构解析 iptvnator采用现代

By Ne0inhk