news 2026/7/10 14:24:38

算法分析--基数排序

作者头像

张小明

前端开发工程师

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/7/9 12:48:28

LLM 场景下的强化学习技术扫盲

强化学习基础&#xff1a;行业黑话想象你正在和一个刚训练好的语言模型聊天。你问&#xff1a;“今天过得怎么样&#xff1f;”模型可能回&#xff1a;“还行。” 也可能回&#xff1a;“我是个 AI&#xff0c;没有感情。”人类觉得前者更自然、更友好——这就是偏好反馈。强化…

作者头像 李华
网站建设 2026/7/10 8:53:23

多智能体协同系统

多智能体协同系统的核心概念 多智能体协同系统&#xff08;Multi-Agent Systems, MAS&#xff09;通过多个自主智能体的交互实现复杂任务&#xff0c;广泛应用于机器人协作、自动驾驶、游戏AI等领域。核心特性包括分布式决策、通信协议、任务分配与冲突解决。典型应用案例 1. 无…

作者头像 李华
网站建设 2026/7/10 9:40:28

多角度关于人的本质的论述,你怎么思考?

第六章&#xff1a;多角度关于人的本质的论述人的本质&#xff0c;人和动物的区别是什么&#xff0c;此文可以参考。这个问题很深奥&#xff0c;历来人类试图回答。比如中国古代对于人&#xff0c;有善恶之分&#xff0c;但这显然不具有说服力。以下是马克思哲学关于人本质的思…

作者头像 李华
网站建设 2026/7/10 10:43:29

Flutter 实现一个容器内部元素可平移、缩放和旋转等功能(六)

Flutter 实现一个容器内部元素可平移、缩放和旋转等功能&#xff08;六&#xff09; Flutter: 3.35.6 前面有人提到在元素内部的那块判断怎么那么写的&#xff0c;看来对知识渴望的小伙伴还是有&#xff0c;这样挺好的。不至于说牢记部分知识&#xff0c;只需要大致了解一下有…

作者头像 李华
网站建设 2026/7/10 10:42:23

python作业4

a 56 b -18# 1. 按位与(&)&#xff1a;对应位都为1则为1&#xff0c;否则为0 # 56: 00111000 # -18补码: 11101110 # 按位与: 00101000 → 十进制40 bit_and a & b print(f"按位与(&): {a} & {b} {bit_and}")# 2. 按位或(|)&#xff1a;对应位有…

作者头像 李华
网站建设 2026/7/9 22:26:35

今天教大家免费使用先进的AI大模型,非常详细收藏这一篇就够了

为什么要使用ai模型&#xff1f; 用好ai可以解决你想做的事情比如数据录入、数据整理、数据分析、数据报告等等问题。只要你想好规则&#xff0c;他都可以给你生成&#xff0c;而且你要担心数据泄露问题&#xff0c;完全可以让他给你生成一个离线的app或者exe程序或者前端程序&…

作者头像 李华