news 2026/6/9 23:17:23

算法分析--基数排序

作者头像

张小明

前端开发工程师

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/6/10 13:22:15

js函数声明和函数表达式的理解

在JS中,函数声明会被提升&#xff0c;这意味着函数可以在声明之前被调用。当你使用函数声明的方式定义函数: function resizeFn() {...}整个函数声明会被提升到作用域的顶部。这意味着在整个作用域内&#xff0c;无论函数在何处声明&#xff0c;都可以在声明前调用。函数声明会…

作者头像 李华
网站建设 2026/6/7 2:42:28

奶奶都能看懂的 C++ —— vector 与迭代器

但是在讲解它之前&#xff0c;我们需要先了解迭代的对象是什么。常见的一种&#xff0c;叫做 vector。vector 类型使用可变有序序列我们知道&#xff0c;数学里&#xff0c;vector 是向量的意思。但 C 里的向量和它不太一样。它的含义是&#xff0c;具有可变元素个数的有序对象…

作者头像 李华
网站建设 2026/6/8 13:22:07

基于java的SpringBoot/SSM+Vue+uniapp的校园活动管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言 &#x1f31e;博主介绍&#xff1a;✌全网粉丝15W,CSDN特邀作者、211毕业、高级全…

作者头像 李华
网站建设 2026/6/10 12:26:53

MPK(Mirage Persistent Kernel)源码笔记(1)--- 基础原理

x00 概要 CMU 贾志豪老师团队提出的MPK&#xff08;Mirage Persistent Kernel&#xff09;是依托 Mirage 编译器生态的创新运行时系统&#xff0c;其核心能力在于将多GPU环境下大语言模型&#xff08;LLM&#xff09;推理任务自动转换为适配GPU架构的高性能巨型内核&#xff0…

作者头像 李华
网站建设 2026/6/8 4:01:33

PHP 异常处理全攻略 Try-Catch 从入门到精通完全指南

什么是 Try-Catch&#xff1f; Try-catch 是 PHP 处理异常的机制——程序执行期间发生的意外事件或错误。与其让应用程序崩溃&#xff0c;try-catch 允许你拦截这些错误并优雅地处理它们。 把它想象成一张安全网。你“尝试”执行可能失败的代码&#xff0c;如果失败了&#xf…

作者头像 李华