news 2026/4/16 14:47:43

算法分析--基数排序

作者头像

张小明

前端开发工程师

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/15 12:17:16

华为OD机考双机位C卷 - 计算误码率 (Java Python JS C/C++ GO )

最新华为上机考试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 2025华为od机试双机位C卷 题目描述 误码率是最常用的数据通信传输质量指标。它可以理解为“在多少位数据中出现一位差错”。 移动通信网络中的误码率主要是指比特误码率,其计算公式如下: 比特…

作者头像 李华
网站建设 2026/4/15 13:39:52

jemalloc思想的极致演绎:深度解构Netty内存池的精妙设计与实现

Netty内存池的核心设计借鉴了jemalloc的设计思想。jemalloc是由Jason Evans在FreeBSD项目中实现的高性能内存分配器&#xff0c;其核心优势在于通过细粒度内存块划分与多层级缓存机制&#xff0c;降低内存碎片率并优化高并发场景下的内存分配吞吐量。 Netty基于jemalloc的多Ar…

作者头像 李华
网站建设 2026/4/15 16:22:13

复习——共享内存

共享内存一、共享内存&#xff08;Shared Memory&#xff09;1.1 基本概念System V提供&#xff1a;UNIX操作系统的进程间通信方式特点&#xff1a;效率最高的IPC方式1.2 操作流程key → 申请对象 → 映射对象 → 读写对象 → 撤销映射 → 删除对象1.3 与管道的区别特性共享内存…

作者头像 李华
网站建设 2026/4/15 23:42:41

高职金融科技应用专业可考取的金融科技类证书

金融科技&#xff08;FinTech&#xff09;是金融与科技融合的领域&#xff0c;涉及数据分析、区块链、人工智能、云计算等技术。高职金融科技应用专业的学生可通过考取相关证书提升竞争力。以下为适合该专业考取的金融科技类证书&#xff0c;包括CDA数据分析师证书。数据分析类…

作者头像 李华
网站建设 2026/4/15 10:32:55

(100分)- 报数游戏(Java JS Python)

(100分)- 报数游戏&#xff08;Java & JS & Python&#xff09;题目描述100个人围成一圈&#xff0c;每个人有一个编码&#xff0c;编号从1开始到100。他们从1开始依次报数&#xff0c;报到为M的人自动退出圈圈&#xff0c;然后下一个人接着从1开始报数&#xff0c;直到…

作者头像 李华