数据结构-基数排序
基数排序
基本思想
基数排序其实就是依靠多位关键字进行排序,现在我们有一个数据为101,那么“101”就是一个三位
关键字,分别为:“百位->1”、“十位->0”、“个位->1”。
此时我们就可以按照三位关键字进行排序,一般而言,排序有两种:“最高位优先(MSD)”、“最
低位优先(LSD)”。
名词概念
基数
还是对于上面的数据101,它是一个三位关键字,分别为:“1”、“0”、“1”,对于每一位关键字,它
的取值范围为:“0->9”,共十种可能,我们把这些可能性称为:“基数”(简写为r),因此可以说,
101基数为10(r=10)。
关键字位数
仍然对于数据101来说,共有三位,因此它的关键字位数就是三位,分别为:“百位”、“十位”、“个
位”。
代码思路
基数排序的精髓在于:“分配”、“收集”。
每次按关键字进行分配,当前趟数的关键字相同的数据分配到一个队列中。
每次分配完毕后,都需要将不同队列的数据连接在一起,形成一个新的链表。
我们需要使用链式结构来存储数据,同时创建r(基数)个队列,用来辅助存储我们交换中的数
据。
代码实现
#include<stdio.h>
#include<math.h>
#define MAX_KEY 8 //关键字最大位数
#define RADIX 10 //关键字基数
#define MAX_SPACE 100 //数据单元大小
typedef struct{int keys; //关键字 int next; //下一个数据位置
}SLnode; //静态链表单元
typedef struct{SLnode R[MAX_SPACE+1]; //R[0]做哨兵单元 int length; //静态链表中数据长度 int keynum; //关键字位数
}SLList;
typedef int Queue[RADIX]; //静态队列void InitMySLList(SLList *L)
{int Sample_Data[10] = {614,738,921,485,637,101,215,530,790,306};int i;L->length = 10; //链表长度 L->keynum = 3; //关键字位数for(i=1;i<=L->length;i++){L->R[i].keys = Sample_Data[i-1]; //初始化数据 }for(i=0;i<L->length;i++){L->R[i].next = i + 1; //修改next域,组建成一个静态链表. } L->R[L->length].next = 0; //尾结点指向0
}int GetKey(int n,int i) //求第i位关键字,n为数据
{int k;k = ((int)(n / pow(RADIX,i))) % RADIX;return k;
}void Distribute(SLList *L,int i,Queue f,Queue e) //第i趟分配函数
{//静态链表中的0->i-1位关键字已经有序//队列中存储的是数据在静态链表中的位置(索引)//实现按第i位关键字有序,建立RADIX个队列.//f,e分别代表队头指针和队尾指针int j,p;for(j=0;j<RADIX;j++){ //初始化队列 f[j] = 0;e[j] = 0;}for(p=L->R[0].next;p;p=L->R[p].next){j = GetKey(L->R[p].keys,i); //求第i位关键字 if(f[j] == 0) //队列为空时,直接从队头入第一个数据 f[j] = p;else //队列不为空,需要从队尾入数据,也就是队列中最后一个元素的next域 L->R[e[j]].next = p;e[j] = p; //队尾指针存储队列中的最后一个数据. }
}void Collections(SLList *L,int i,Queue f,Queue e) //第i趟收集
{int j,t;for(j=0;f[j]==0;j++); //找到第一个非空队列L->R[0].next = f[j]; //R[0].next 指向第一个非空队列队头t = e[j]; //t指向第一个非空队列队尾while(j<RADIX){for(j++;j<RADIX-1&&!f[j];j++);if(f[j] && j<RADIX){ //j<RADIX不能漏 L->R[t].next = f[j]; //当前队尾和下一个队头相连接 t = e[j]; //t存储最新队列的队尾 }}L->R[t].next = 0; //队尾指向0
}void RaDixSort(SLList *L) //基数排序
{Queue f,e;int i;for(i=0;i<L->keynum;i++){Distribute(L,i,f,e);Collections(L,i,f,e);}
}void OutPutMyRadix(SLList *L) //打印结果
{int i;for(i=L->R[0].next;i;i=L->R[i].next){printf("%d ",L->R[i].keys);}
} int main()
{SLList L;InitMySLList(&L);RaDixSort(&L);OutPutMyRadix(&L);return 0;
}
相关文章:
数据结构-基数排序
基数排序 基本思想 基数排序其实就是依靠多位关键字进行排序,现在我们有一个数据为101,那么“101”就是一个三位 关键字,分别为:“百位->1”、“十位->0”、“个位->1”。 此时我们就可以按照三位关键字进行排序&…...
基于ASP.NET MVC技术的图书管理系统的设计与实现
基于ASP.NET MVC技术的图书管理系统的设计与实现 摘要:图书管理系统是一套高新科学技术和图书知识信息以及传统历史文化完美结合的体现。它改变了传统图书收藏的静态书本式图书服务特征,实现了多媒体存取、远程网络传输、智能化检索、跨库无缝链接、创造…...
C++17中的结构化绑定
C17中的结构化绑定(structured binding):将指定名称绑定到初始化程序的子对象或元素。简而言之,它们使我们能够从元组或结构中声明多个变量。与引用一样,结构化绑定是现有对象的别名;与引用不同,结构化绑定不必是引用类型(referen…...
Mover Creator 用户界面
1 “开始”对话框 首次打开 Mover Creator 时,出现的第一个页面是“开始”对话框,如下所示。从这里开始,用户可以选择开始设计飞机、武器或发动机。在上述每种情况下,用户都可以创建新模型或编辑现有模型。 1.1 新建模型 如果用…...
『Nginx安全访问控制』利用Nginx实现账号密码认证登录的最佳实践
📣读完这篇文章里你能收获到 如何创建用户账号和密码文件,并生成加密密码配置Nginx的认证模块,实现基于账号密码的登录验证 文章目录 一、创建账号密码文件1. 安装htpasswd工具1.1 CentOS1.2 Ubuntu 二、配置Nginx三、重启Nginx 在Web应用程…...
MongoDB导入导出命令
(1)mongoexport命令 例如: mongoexport --db testdb --collection person --out person.json mongoexport --db testdb --collection person --fields name,age --out person.json mongoexport --db testdb --collection person --query {&qu…...
软件工程期末复习(1)
学习资料 软件工程知识点总结_嘤桃子的博客-CSDN博客 软件工程学习笔记_软件工程导论第六版张海藩pdf-CSDN博客 【软件工程】软件工程期末试卷习题课讲解!!_哔哩哔哩_bilibili 【拯救者】软件工程速成(期末考研复试软考)均适用. 支持4K_哔哩哔哩_bil…...
nextjs入门
创建项目 npx create-next-app 项目名 体验文件路由 nextjs提供了文件路由的功能, 根据文件系统的目录结构, 可以识别为对应的页面路由 创建页面 首先, 在src下创建pages目录, 然后创建一个about文件(对应about页面)和main/index.js文件(对应首页) pages/main/index con…...
【C语言】字符串函数strlen #strcpy #strcmp #strcat #strstr及其模拟实现
在C语言中,有一种特殊的数据类型,即字符串类型。C 并没有专门定义一个字符串类型,这对我们使用字符串造成了一定的麻烦。但是,C标准库<string.h> 中定义了各种字符串函数,这对于我们来说是一件值得庆幸的事情。…...
递归实现组合型枚举
递归实现组合型枚举 #include<iostream> #include<vector>int n, m; std::vector<int>res; bool st[30];void Print() {for(int i0;i<res.size();i){printf("%d ",res[i]);}puts(""); }void dfs(int num) {if (res.size() m){Print(…...
SCAU:1065 数组中的指针
1065 数组中的指针 时间限制:1000MS 代码长度限制:10KB 提交次数:3436 通过次数:1692 题型: 编程题 语言: G;GCC Description 设有如下数组定义: int a[3][4]{{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 计算下面各项的值(设数组a的首地址为2000&…...
找不到msvcp110.dll如何修复?分享5个亲测有效的修复方法
在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp110.dll丢失”。这个错误通常发生在运行某些程序时,系统无法找到所需的动态链接库文件。那么,msvcp110.dll到底是什么呢?它又有什么作用࿱…...
LeetCode刷题笔记第80题:删除有序数组中的重复项 II
LeetCode刷题笔记第80题:删除有序数组中的重复项 II 题目: 删除升序数组中超过两次的元素后的数组长度 想法: 使用快慢指针的方法完成,使用快指针遍历整个数组,使用慢指针完成相同元素最多保留两个。在快指针遍历到…...
【开源存储】minio对象存储部署实践
文章目录 一、前言1、介绍说明2、部署方式3、冗余模式4、约束限制4.1、规格参数4.2、API支持a、minio不支持的Amazon S3 Bucket APIb、minio不支持的Amazon S3 Object API 二、部署说明1、软件安装2、minio单机部署3、minio分布式部署3.1、前置条件3.2、开始运行3.3、操作说明 …...
Java编程强化练习(二)
表达式计算(支持空格,连乘,连除)(选做题,不计分) 【问题描述】 从标准输入中读入一个整数算术运算表达式,如5 - 1 * 2 * 3 12 / 2 / 2 。计算表达式结果,并输出。 …...
Redis的高可用模式
1. 什么是高可用? 高可用(High Availability, HA)是指在信息技术中确保系统、服务或应用程序在绝大多数时间内都是可操作和可访问的能力。这通常涉及以下几个关键方面: 最小化停机时间: 高可用系统的目标是减少因硬件故障、系统升…...
非功能关键知识总结(一)
文章目录 一、稳定性(一)、服务级别协议1、SLA2、OLA3、UC (二)、可用性指标(三)、突发事件等级 三、质量(一)、千行代码缺陷数量(二)、软件质量模型的发展(三)、产品质量模型 四、安全(一)、网络安全 五、灾备(一)、灾备指标(二)、灾难恢复等级(三)、容灾技术分类 一、稳定性 …...
时间序列趋势检验相关检验方法:斜率法、Cox-Stuart检验、Mann-Kendall检验
文章目录 1.斜率法1.1.原理1.2.优缺点1.3.Python代码2.Cox-Stuart检验2.1.原理2.2.优缺点2.3.Python代码3.Mann-Kendall 检验3.1.原理3.1.1.假设前提3.1.2.趋势检验3.1.3.S到Z的变换原理3.1.4.Var(s)是如何得到的3.1.5.衡量趋势的指标:倾斜度...
Redis相关知识
yum安装redis 使用以下命令:直接将redis安装到Linux服务器(Xshell)中 yum -y install redis 启动redis 使用以下命令,以后台运行方式启动redis redis-server /etc/redis.conf & 操作redis 使用以下命令启动redis客户端 redis-…...
数据管理系统-week10-自由访问控制
文章目录 前言一、用户管理用户管理语句介绍二、数据库管理三、特权(重点考点)Administrative (global) privileges数据库特权表权限列权限四、角色参考文献前言 这节课主要讲了用户管理数据库的具体语句,数据库特权当中的全局特权,数据库特权,表特权与列特权的使用与注意…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
