news 2026/4/3 8:01:13

算法分析--基数排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法分析--基数排序

时间复杂度 O(KN)线性

高位优先(不好)

先按照高位升序排序,依次进行下去,直到排到最低位。

image

因为高位有一个分组的动作,在每个组里面对低位再排序。可以用递归。实际上,完全可以用低位排序。

低位排序(好)

image

首先按照个位数字进行一次 稳定排序(相同数字顺序不变)

然后按照十位数字进行一次 稳定排序(相同数字顺序不变)

然后按照百位数字进行一次 稳定排序(相同数字顺序不变)

代码编写

n个数字,如何得到每个数位上的数值:

低位抹去

再取个位(模10)

int index = a[i]/base % 10;

如果想要给每个数字按个位数排序,第一步需要干什么?

找到每个数字应该去的位置的索引。

// 统计每个数字出现的次数

memset(count,0,sizeof(int)*10);

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

int index = (a[i] / base ) %10; // base是控制当前是个位,十位,还是百位

count[index]++;

}

// 计算每个数字的起始位置

start[0]=0;

for(int i=1;i<10;i++){

start[i]=start[i-1]+count[i-1];

}

// 放入temp临时数组

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

int index=(a[i] / base )% 10;

temp[start[index]]=a[i];

start[index]++;

}

再思考一个问题:为什么要把temp再拷回去

memcpy(a,temp,n*sizeof(int));

最后一个问题:为什么要计算最大位数(GetMaxDigit)

每个数字的位数可能不一样。比如:3,27,451,98。找出最大位数,就是循环次数。

如果百位是空的,按照代码 3 / 100 = 0 → %10 = 0 就是0,是有效的。

代码总结

#include<iostream>

#include<algorithm>

#include<cstring>

using namespace std;

int array[200];

int GetMaxDigit(int n){

int maxdata=*max_element(array,array+n); //max_element是<algorithm>的一个函数,在 [a, a+n) 这个范围里,找到“最大元素的位置,返回指针

int maxdigit = 0;

while(maxdata){

maxdata/=10;

maxdigit++;

}

return maxdigit;

}

void Sort(int n){

int base=1,digit=GetMaxDigit(n);

int temp[n];

int count[10];

int start[10];

while(digit--){

// 统计每个数字出现的次数

memset(count,0,sizeof(int)*10);

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

int index = array[i]/base%10;

count[index]++;

}

// 计算每个数字的起始位置

memset(start,0,sizeof(int)*10);

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

start[i]=start[i-1]+count[i-1];

// 放入temp临时数组

memset(temp,0,sizeof(int)*n);

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

int index = array[i]/base%10;

temp[start[index]]=array[i];

start[index]++;

}

memcpy(array,temp,n*sizeof(int));

base*=10;

}

}

void show(int n){

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

cout<<array[i]<<" ";

}

}

int main(){

int n;cin>>n; // 有n个数字

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

cin>>array[i];

Sort(n);

show(n);

return 0;

}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 15:39:55

计算机Java毕设实战-基于springboot的汽车租赁买卖管理系统的设计与实现入库录入、租赁登记、租赁状态查询【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/2 15:54:02

华为OD机考双机位C卷 - 编程能力提升计划 (Java Python JS C/C++ GO )

最新华为上机考试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 华为OD机考双机位C卷 题目描述 为了提升软件编码能力,小王制定了刷题计划,他选了题库中的n道题,编号从0到n-1,并计划在m天内按照题目编号顺序刷完所有的题目(注意,小王不能用多天完成同一…

作者头像 李华
网站建设 2026/4/3 6:42:21

ORACLE检查并创建表空间和表分区

为确保系统在高并发、大数据量环境下的稳定高效运行&#xff0c;要求建立完善的表空间与表分区管理机制&#xff0c;具体包括&#xff1a;定期检查表空间使用率&#xff0c;及时发现并处理空间不足风险&#xff1b;建立分区自动创建与维护流程&#xff0c;防止因分区缺失导致的…

作者头像 李华
网站建设 2026/3/14 12:21:21

港媒盛赞“香港媳妇”徐冬冬!婚照惊艳全网,港圈作品圈粉无数

12月18日&#xff0c;徐冬冬与尹子维的婚纱照强势空降热搜&#xff0c;甜酷兼具的造型让网友直呼美貌惊艳&#xff0c;气质独一份。从戏里媚骨天成的“大嫂”到戏外被港媒追捧的“香港媳妇”&#xff0c;这位东北大妞不仅用八年分合的爱情故事打动人心&#xff0c;更在港娱圈深…

作者头像 李华
网站建设 2026/3/31 20:07:55

Redis高级特性与生产环境部署

Redis高级特性与生产环境部署实践一、Redis核心数据类型深度解析1.1 哈希&#xff08;Hash&#xff09;类型详解1.1.1 哈希数据结构# 哈希结构示意图 key: "user:1001" value: {"name": "张三","age": 25,"city": "北京…

作者头像 李华
网站建设 2026/4/1 18:18:10

java计算机毕业设计网咖会员管理系统 电竞馆会员计费与点餐一体化平台 网吧会员上机充值及订单管理系统

计算机毕业设计网咖会员管理系统67kvh9&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。疫情后电竞消费井喷&#xff0c;传统网吧前台手工登记、纸质充值券、Excel对账的模式已无法…

作者头像 李华