第三章:查找与排序(下)----------- 3.21基数排序

银河麒麟V10-ARM架构-postgresql安装与部署指南 本文详细介绍应用源码进行pgsql的安装步骤,本文以postgresql-12.0为例。提示:以下是本篇文章正文内容,下面案例可供参考银河麒麟系统安装程序比较繁琐,潜在问题比较多,个人建议均通过源码自定义编译安装。国产系统还需努力啊! 阅读详情

基数排序:

       基数排序过程无须比较关键字,而是通过“分配”和“收集”过程来实现排序,它的时间复杂度可达到线性阶:O(n)。(ps:kN)。对于十进制数来说,每一位的数在[0,9]之中,d位的数,则有d列。基数排序首先按低位有效数字进行排,然后逐次向上一位进行排序,直到最高位排序结束。

 约定: 待排数字中没有0,没有负数(有负数,做一次转换全部变为正数即可)

算法过程: 

(1)、假设有欲排数据序列如下所示:

73 22 93 43 55 14 28 65 39 81。

首先根据个位数的数值,在遍历数据时将它们各自分配到编号0至9的桶(个位数值与桶号一一对应)中。

分配结果(逻辑想象)如下图所示:

分配结束后。接下来将所有桶中所盛数据按照桶号由小到大(桶中由顶至底)依次重新收集串起来,得到如下仍然无序的数据序列:

81 22 73 93 43 14 55 65 28 39

(2)、接着,再进行一次分配,这次根据十位数值来分配(原理同上),分配结果(逻辑想象)如下图所示:

分配结束后。接下来再将所有桶中所盛的数据(原理同上)依次重新收集串接起来,得到如下的数据序列:

14 22 28 39 43 55 65 73 81 93。

(3)以此类推……

如果排序的数据序列有三位数以上的数据,则重复进行以上的动作直至最高位数为止。

代码:

#include<iostream>
#include<cmath>
#include<vector> 
using namespace std;

/**********************************/ 
//函数声明: 
void sort(int arr[],int d,int length);
void putInBucket(int data,int digitOn);
int getDigitOn(int src,int d);
/**********************************/

/***********************************/
//全局变量:
vector<int> bucket[10];


//将数组arr,按d这个位来分配和收集 
void sort(int arr[],int length){
	int d=1;//入桶依据的位初始化为1
	
	int maxn=arr[0];//数组的最大值 
	for(int i=1;i<length;i++){
		maxn=max(maxn,arr[i]);
	} 
	
	int dNum=1; //最大值有多少位
	while(maxn/10!=0){
		dNum++;
		maxn/=10;
	}
		
	while(d<=dNum){
		//依据第二个参数入桶和出桶
		sort(arr,d++,length); 
	} 	
} 

// 重载的sort:将数组arr, 按d这个位来分配和收集
void sort(int arr[],int d,int length){
	//全部入桶
	for(int i=0;i<length;i++){
		putInBucket(arr[i],getDigitOn(arr[i],d));
	} 
	
	//出桶 
	//每个桶中的元素依次压入原数组
	int k=0;
	for(int j=0;j<10;j++){
		while(bucket[j].size()){
			arr[k++]=bucket[j].front();
			bucket[j].erase(bucket[j].begin());  //比较巧妙,移除第一个元素!
		}
	}	
} 
 
//得到十进制数src的第d位:
int getDigitOn(int src,int d){
	return src/(int)(pow(10,d-1))%10;
} 

void putInBucket(int data,int digitOn){  
	switch(digitOn){
		case 0:
			bucket[0].push_back(data);
			break;
		case 1:
			bucket[1].push_back(data);
			break;
		case 2:
			bucket[2].push_back(data);
			break;
		case 3:
			bucket[3].push_back(data);
			break;
		case 4:
			bucket[4].push_back(data);
			break;
		case 5:
			bucket[5].push_back(data);
			break;
		case 6:
			bucket[6].push_back(data);
			break;
		case 7:
			bucket[7].push_back(data);
			break;
		case 8:
			bucket[8].push_back(data);
			break;
		case 9:
			bucket[9].push_back(data);
			break;	
	}
		
}

int main(){
    
    int arr[]={18,13,17,26,29,38,31,69,51};
	int len=9;
	
	sort(arr,len);
    
    //打印结果:
	for(int i=0;i<len;i++){
		cout<<arr[i]<<" ";
	} 
    
	return 0;	
}

 得到十进制数src的第d位(需背住):

 //得到十进制数src的第d位:
int getDigitOn(int src,int d){
	return src/(int)(pow(10,d-1))%10;
} 

运行结果:

小结:

计数排序: 适用于小范围数据;

桶排序:    适用于均匀分配的数据。

 

参考:lanqiao.coding.me

ABB机器人与西门子PLC、工业相机联合实现无序抓取的完整调试方案 将此方案导入系统后,逐步执行调试,确保各环节信号正常触发,即可实现高效无序抓取! 阅读详情

相关推荐

Plaxis软件简介及 Plaxis Python API环境搭建、自动化建模、Python全自动实现、高级案例分析

本次课程主要针对岩土工程中的各种问题(塑性、渗流、固结、动力、稳定安全、热力TM),用四天时间,教大家如何一步一步地搭建自己的Plaxis模型,包括Plaxis Python API的连接与配置、外部Python编译器的使用、Python命令流自动建模过程、Python远程脚本读取输出结果等,其中的Python建模模块尽可能做到让学员零基础开始,通过提供标准命令流库,使用搭积木、摆乐高的形式模块化进行,加强学员的易上手、可操作性。(2)钻孔的建立、土层的建立、土层属性、水力条件及初始条件、导入土层。

CCfz566的博客 1464

基数排序(桶排序)思路整理

首先了解一下什么是基数排序: 基数排序是桶排序的扩展,不了解桶排序也没有关系。它是通过待排序列中每个值的各个位,将每个值按照一定规则放置“桶”中,达到排序的效果。(刚刚接触这段介绍肯定是不太懂的,定义的作用就是可是帮助我们学完基数排序回过头思考,所以不理解没关系) 基数排序的基本思想: 将所有待排列的数统一为相等长度的数位,数位短的在前面补0。例如:统一35,246这两个数。按照最长位统一,数位短的补0也就是035,结果就和246数位一样长了。然后再将每个数依次从最低位开始比较,比较的过程中按照一定规则放入

weixin_45642253的博客 722

GD32F303片内FLASH实战:从地址映射到数据持久化存储

本文详细介绍了GD32F303片内FLASH的实战应用,从地址映射到数据持久化存储的全过程。通过解析FLASH的基础特性、安全操作区域规划、擦除写入读取的三重奏操作,以及工程化进阶技巧,帮助开发者高效利用片内FLASH进行数据存储。文章还提供了调试技巧和常见问题解决方案,特别适合嵌入式开发者在实际项目中应用。

weixin_26742753的博客 218

基数排序

基数排序是采用“分配”与“收集”的办法,用对多关键码进行排序的思想实现对单关键码进行排序的方法。多关键码排序:1.以扑克牌排序为例。每张扑克牌有两个“关键码”:花色和面值。其有序关系为:花色:面值:2 2.如果我们把所有扑克牌排成以下次序:3.这就是多关键码排序。排序后形成的有序序列叫做词典有序序列。 4.对于上例两关键码的排序,可以先按花色排序,之后再按面值排序;也可以先按面值排

Generalseed的专栏 633

利用python爬取东方财富网股吧评论并进行情感分析(一)

利用python爬取东方财富网股吧评论(一) python-东方财富网贴吧文本数据爬取 分享一下写论文时爬数据用到的代码,有什么问题或者改善的建议的话小伙伴们一起评论区讨论。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片拖拽 功能,你可以将本地的图片直

YMG521000的博客 1万+

双向全桥隔离DC-DC变换器(DAB)的调制优化与挑战解析

本文深入解析了双向全桥隔离DC-DC变换器(DAB)的核心调制技术及其面临的挑战。文章从基础的相移调制(SPS)入手,逐步探讨了扩展相移(EPS)、双重相移(DPS)等进阶策略,并重点分析了电流优化与零电压开通(ZVS)等硬核优化技巧。针对DAB在实际应用中存在的建模困难、多模块并联及数字实现等挑战,提供了实用的应对策略与设计思路,旨在帮助工程师在性能、复杂度与成本之间找到最佳平衡。

weixin_29271053的博客 573

3.2.1 快速排序

## 3.2求解排序问题 快速排序 该方法的基本思想是: 1.先从数列中取出一个数作为基准数。 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。 3.再对左右区间重复第二步,直到各区间只有一个数。 分治法具体操作: int Partition(int a[],int s,int t) //划分算法 { int i=s,j=t; int tmp=a[s]; //用序列的第1个记录作为基准 while (i!=j) //从序列两端交替向中间扫描,直至i=j为止

最棒的yee 303

ENVI入门系列教程---一、数据预处理---1.1基本操作--5.x以后的界面(新界面)

every blog every motto: You never know how strong you really are until being strong is the only choice you have。 0. 前言 本系列教程旨在系统学习并梳理ENVI。说来惭愧,作为一名GISer,对ENVI这类软件还不能熟练掌握,这也是本系列教程的初衷。种一棵树最好的时间是十年以前,其次是...

胡侃有料的博客 1万+

数据结构内排序题库

网络课课后题 1、已知一组元素的排序码为(46,74,16,53,14,26,40,38,86,65,27,34),利用直接插入排序的方法(第一个数字不用插入),写出第四次向前面有序表插入一个元素后的排列结果。 解析 未插入元素前,排列结果为46 74 16 53 14 26 40 38 86 65 27 34 第一次插入74,结果为 46 74 16 53 14 26 40...

闲狗的博客 1万+

华为OD机试真题 新系统2026-04-01 C语言 实现【空间占用计算】

员工A的磁盘空间经常被耗尽,他需要找到占用空间最大的目录或文件,然后决定如何清理文件释放空间。给定某一目录,请编写程序帮助他统计该目录内一级子目录和文件的占用空间,并返回目标目录一级子项(文件或子目录)中占用空间最大的项。

MISAYAONE的博客 231

第六:Charles抓包-苹果手机抓包

【代码】第六:Charles抓包-苹果手机抓包。

欢迎来到本博客! 1658

内部排序算法:基数排序

基本思想 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。 基数排序可以采用两种方式: LSD(Least Significant Digital):从待排序元素的最右边开始计算(如果是数字类型,即从最低位个...

weixin_33739627的博客 360

ROCm rocr-libhsakmt分析系列1-2:多GPU跨卡VRAM访问机制分析

本文基于ROCr-Runtime的libhsakmt库源码,深入分析了多GPU系统中跨设备内存访问的实现机制。主要内容包括: 实现流程概述:通过P2P拓扑发现、统一虚拟地址空间、页表映射和硬件转发四个步骤,实现零拷贝的跨GPU内存访问。

图形/计算GPU的驱动与虚拟化技术分享园地 2509

2021-08-21 数据结构的查找与排序-笔记

数据结构的查找与排序-笔记查找线性表的查找树的查找(动态查找树)排序插入排序直接插入排序(数组、链表)折半插入排序(数组)希尔排序(数组)交换排序 查找 线性表的查找 1.顺序查找 优点:算法简单逻辑次序无要求,且不同存储结构均适用 缺点:ASL太长,事件效率太低 2.折半(二分)查找 优点:效率比顺序查找高 缺点:只是用于有序表,且限于顺序存储结构(对线性链表无效) 3.分块查找(索引顺序查找,分块有序) 优点:插入和删除比较容易,无序进行大量移动 缺点:要增加一个索引表的存储空间并对初始索引表进行排序运

不爱吃奶昔(zsl0)的博客 666

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

基数排序算法及优化(java)

基数排序是一种非比较排序算法,适用于整数或字符串等类型的排序。通过合理选择按位排序和稳定排序的方法,可以大大提高基数排序的效率。无论是在理论研究还是实际工程中,基数排序都是一个值得深入了解的重要算法。

weixin_43841461的博客 1155

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

插入排序-希尔排序-选择排序-冒泡排序-快速排序-基数排序-外部排序-归并排序[数据结构与算法]

文章详细总结了插入排序、希尔排序、选择排序、归并排序、交换排序(冒泡排序、快速排序)、基数排序、外部排序。从`思想`到`代码实现`。 大三党,大数据专业,正在为面试准备,欢迎学习交流`。

weixin_44972997的博客 4091

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[C++]基数排序的实现

  大家好,今天带来的是自己实现的用C++完成基数排序.在数据结构,算法分析和程序设计的学习过程中,我们经常也无法避免的要学到排序的算法.排序算法是程序设计过程中使用频率极高的算法之一,其输入是一组无序的序列,要求以升序或者降序的方式输出一组有序的序列.对于如二分查找等算法,要求输入是有序的序列,也就是要先排序后查找,由此可见排序算法的重要性.   广为人知的排序算法有冒泡排序,还有选...

bam2332的博客 317

算法三、排序与查找

快速排序、双路快排、三路快排、基数排序、桶排序、计数排序、所有排序测试速度含数据、二分查找、插值查找

Ningmengyouzhi的博客 554

c++十大排序算法之基数排序

c++排序之基数排序

hesphoros的个人博客 543

【考研】C语言排序和查找算法总结

本文将基于学生成绩管理程序来介绍常用的排序和查找算法及其总结。

Stu_Yang的博客 2939

【数据结构】(C++数据结构)查找算法与排序算法详解

本文详细介绍了C++中的查找与排序算法。查找算法部分涵盖二分查找、插值查找和斐波那契查找,重点分析了它们的实现原理、代码示例和复杂度特征。排序算法部分则阐述了冒泡排序及其改进版本、归并排序的分治策略实现,以及基数排序的位处理机制。文中通过完整代码示例和数学公式推导,展示了各算法的核心思想与优化技巧,为数据结构学习提供了系统的算法参考。

2403_87771104的博客 1308

Go语言学习笔记【15】 排序算法之堆排序、桶排序、基数排序

go实现堆排序、桶排序、基数排序算法

LC520730的博客 671

【数据结构与算法-Day 45】超越比较的极限:详解非比较排序之王——基数排序

本文将继续深入非比较排序的领域,介绍一位重量级成员——**基数排序 (Radix Sort)**。基数排序是一种非常巧妙的整数排序算法,其核心思想是将整数按位数切割成不同的数字,然后按每个位数分别比较。它不直接比较整个数字的大小,而是通过多轮“分配”与“收集”的过程,最终实现整个序列的有序。本文将从基数排序的直观理解、核心原理、代码实现、性能分析到应用场景,对其进行全面而深入的剖析,并最终提供一份各大排序算法的综合对比表,助你构建完整的排序知识体系。

吴师兄大模型的博客 1028

数据结构与算法——二分查找,排序

堆是一种基于树的数据机构,用完全二叉树实现(除了最后一层都必须填满)由于它的特性可以用数组来存储元素。

qq_45730261的博客 975

数据结构学习笔记(7.查找 8.排序)

文章目录第七章 查找查找--基本概念顺序查找折半查找(二分法查找)--重要考点 第七章 查找 查找–基本概念 基本概念 对查找表常见的操作 只查找,静态查找表 插入,删除,动态查找 查找算法的评价指标 查找长度,平均查找长度,默认查找任何一个元素的概率相等 asl的数量级,反映了查找算法时间复杂度 考虑查找成功,查找失败两种情况的ASL 知识点小结 顺序查找 顺序查找的算法思想 不论顺序表还是链表,都是从头到脚向后查 顺序查找实现 课本中的代码实现 增加了哨兵,用来保存要查

super_song的博客 1406

第五章:排序算法

第五章:排序算法1 #mermaid-svg-kLkyHGAAAme5pn1O .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-kLkyHGAAAme5pn1O .label text{fill:#333}#mermaid-svg-kLkyHGAAAme5pn1O .node rect,#mermaid-svg-

Hanjie-chen的博客 5252
上一篇: 第三章:查找与排序(下)----------- 3.20桶排序
下一篇: Ubuntu安装Vim与Gcc
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值