C语言必学的12个排序算法:基数排序

# 基本思想

基数排序(radix sort),同样时一种非比较的内部排序算法,主要基于多关键字排序的思想进行排序,它将单个关键字按照基数分成“多个关键字”进行排序。例如整数789是一个关键字,可以按照十进制位划分多关键字(十进制数字取值0-9,所以基数是10),从高到低分为三个关键字“7、8、9”,这样对每位关键字进行排序,即可得到排序。

基数排序对关键字数据元素有要求,一般是等长的整数和字符串。基数排序是一种稳定的内部排序算法。时间复杂度是O(d*(n radix),d是关键字位数,radix是基数。

例如:对于(21, 12, 31, 10, 30)进行基数排序,可以按照以下步骤进行。

1.根据每一位数字,划分组,最多10组,因为基数为10,代表数字0-9。

2.首先看十位数字,从小到大排序后,可以得到(12,10)(21)(31,30)三组数,数字相同的分为一组。

3.再看个位数字,对上述三组分别进行从小到大排序后,得到(10,12)(21)(30,31),最终得到有序序列。

以上基数排序采用最高位优先方法,从高位到低位进行划分,同样还可以采用从最低位开始排序。最高位优先法排序时候必须不断对划分子序列进行排序,编程实现复杂,最低位优先方法可以每次从低位开始对整个序列进行排序,无需划分。

# 代码实现

1.实现基于“链式基数排序”方法,具体理论参见数据结构相关书籍。

2.基数排序关键操作是分配和收集,分配就是每次根据关键字分组到链队列中,收集是将分组链队列排序后的数据记录整理成完整的链表。

3.使用数组实现静态链表存放待排序的数据记录。

4.需要两个数组辅助,大小为基数,一个数组负责指向链队列头部,一个数组指向链队列尾部。

/* ==========================================  名称   :C语言必学的12个排序算法   功能  :链基数排序   环境   :Windows 10   Dev-C  编译    作者   :一只会C的猫   公众号 :C语言大全(coderpointer)  时间   :2020.7.25 ==========================================*/#include#include// 对整数,基数为10 #define RADIX 10// 最大元素个数#define MAX_LENGTH 100 // 静态链表结点 struct node{  int data;  // 下标代替指针表示下一个结点   int next;}; // 获取关键字每一位数字// i=1 表示个位,i=2,表示十位 int get_digit(int n, int loc){  int i;  for(i=1; i    n = n/10;  return n%10;} // 分配和收集操作void distri_collect(struct node r[], int length, int loc){  // 辅助数组,指向每个链队列   int front[RADIX], rear[RADIX];  // 初始为空  int i;  for(i=0; i  {    front[i] = 0;    rear[i] = 0;  }   // 遍历整个静态链表,按照关键字分配到各链队列  int p,digit;  for(p = r[0].next ; p!=0 ; p=r[p].next)  {    digit = get_digit(r[p].data, loc);     // 链队列为空时直接插入    if(front[digit] == 0)      front[digit] = p;    else    {      // 插入尾部      r[rear[digit]].next = p;     }     rear[digit] = p;   }   // 收集合并  // 找到第一个1非空链队列   for(i=0; front[i] == 0 && i  r[0].next = front[i];  p = rear[i];  while(i<RADIX)  {    // 寻找下一个非空链队列        for(i  ;i<RADIX-1 && front[i]==0;  i);     // 对最后一个元素特殊处理     if(i>=RADIX) break;    if(front[i])      {      // 链接两个非空链队列       r[p].next = front[i];      p = rear[i];     }  }   r[p].next = 0;}void radix_sort(int a[], int length, int k){  // 创建静态链表保存数据  // r[0]表示头结点   struct node r[MAX_LENGTH];  // 初始化链表为空   r[0].next = 0;  int i;  for(i=0; i  {    r[i].next = i 1;    r[i 1].data = a[i];  }  // 链表最后一个元素指向0,表示链表结束   r[i].next = 0;   // 对关键字按照从低位到高位进行排序  for(i=1; i<=k; i  )    distri_collect(r, length, i);   // 将排序后的结果复制到原数组a中  &nbs

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有没有code能改xml内容_Spring源码解析-applicationContext.xml加载和bean的注册

applicationContext文件加载和bean注册流程​ Spring对于从事Java开发的boy来说&#xff0c;再熟悉不过了&#xff0c;对于我们这个牛逼的框架的介绍就不在这里复述了&#xff0c;Spring这个大杂烩&#xff0c;怎么去使用怎么去配置&#xff0c;各种百度谷歌都能查到很多大牛教…

C语言数据类型转换

首先变量的数据类型是可以转换的。转换的方法有两种&#xff0c;一种是自动转换&#xff0c;另一种是强制转换。自动转换即当不同类型的数据进行混合运算时&#xff0c;编译系统将按照一定的规则自动完成。而强制类型转换是由程序员通过编程强制转换数据的类型。自动转换的规则…

java 类持久化_Java 持久化之 -- IO 全面整理(看了绝不后悔)

目录&#xff1a;一、java io 概述什么是IO&#xff1f;IO包括输入流和输出流&#xff0c;输入流指的是将数据以字符或者字节形式读取到内存 分为字符输入流和字符输入流输入流指的是从内存读取到外界 &#xff0c;分为字符输入流和字节输出流Java IO即Java 输入输出系统。不管…

idea 找不到或无法加载主类_解决IDEA中Groovy项目no Groovy library is defined的问题

实验环境IDEA2019.1.2Groovy-2.5.8错误重现新建了一个Groovy工程&#xff0c;指定了groovy版本&#xff0c;如图新建了一个简单的Groovy Class&#xff0c;运行&#xff0c;出现如下错误错误的尝试(以下是试错过程&#xff0c;并不能解决问题&#xff0c;读者可以不要跟着操作&…

C语言标识符、关键字和注释

这一节主要讲解C语言中的几个基本概念。标识符定义变量时&#xff0c;我们使用了诸如“a”“abc”“mn123”这样的名字&#xff0c;它们都是程序员自己起的&#xff0c;一般能够表达出变量的作用&#xff0c;这叫做标识符&#xff08;Identifier&#xff09;。标识符就是程序员…

java 类.class_面试官:Java反射是什么?我回答不上来!

一.概念反射就是把Java的各种成分映射成相应的Java类。Class类的构造方法是private&#xff0c;由JVM创建。反射是java语言的一个特性&#xff0c;它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和…

巧解C语言运算符的优先级和结合性

本篇文章我们从一个例子入手讲解&#xff0c;请看下面的代码&#xff1a;#include int main(){ int a 16, b 4, c 2; int d a b * c; int e a / b * c; printf( "d%d, e%d\n", d, e); return 0; }运行结果&#xff1a;d24, e81) 对于表达式a b * c&#xff0…

jms mdb_MDB!= JMS,反之亦然

jms mdb基本 消息驱动Bean&#xff08;又称为MDB&#xff09;只是另一个EJB&#xff0c;例如无状态&#xff0c;有状态或单例。 使用MessageDriven批注指定。 MDB用于异步消息处理 它们与无状态EJB 相似 &#xff0c;因为它们都是由EJB容器池化的 但是&#xff0c;它们与无状…

C语言中的三目运算符是啥?有何用处?

一般来说&#xff0c;C语言中的三目运算符为a?b:c即有三个参与运算的量。由条件运算符组成条件表达式的一般形式为&#xff1a;表达式1? 表达式2&#xff1a;表达式3求值规则为&#xff1a;如果表达式1的值为真&#xff0c;则以表达式2 的值作为条件表达式的值&#xff0c;否…

status_code想要得到302却得到200_中考200天倒计时!教你高效规划!抓紧抢报预留座位!...

教育点击右上方蓝字关注金石教育金石教育青岛站推送青岛教育资讯&#xff0c;关注孩子成长关注教育主讲人——段莲1、金石教育首席学习规划师&#xff1a;在中考规划行业&#xff0c;段莲老师已经深入研究多年&#xff0c;了解最新的中考数据&#xff0c;并且能够把握住每个数据…

gui jfr_Java飞行记录器(JFR)

gui jfrJFR是一个Java分析器&#xff0c;它使您可以研究代码的运行时特征。 通常&#xff0c;您将使用探查器来确定代码的哪些部分导致大量内存分配或导致消耗过多的CPU。 有很多产品在那里。 过去&#xff0c;我使用过YourKit&#xff0c;OptimizeIt&#xff0c;JProfiler&am…

java 命名内部类_如何把java SWT程序中的匿名内部类改写成命名内部类?

展开全部//请看最后一个e69da5e6ba9062616964757a686964616f31333363386134private class ,其实命名内部类跟普通的java程序一样写&#xff0c;只要知道你自己的监听器要继承于哪个类&#xff0c;实现什么方法public class Level4Class extends ViewPart {private TableViewer …

C语言 | 递增运算符

如何灵活使用C语言递增运算符。 解题思路&#xff1a;自增运算符 使操作数的值加1&#xff0c;其操作数必须为可变左值&#xff08;可简单地理解为变量&#xff09;。对于自增就是加1这一点&#xff0c;读者应该不会有什么疑问。难点在于&#xff1a; 可以置于操作数前面&#…

数据结构实验之图论四:迷宫探索_迷宫搜索类的双向bfs问题(例题详解)

前言文章若有疏忽还请指正&#xff01;更多精彩还请关注公众号&#xff1a;bigsai头条号&#xff1a;一直码农一直爽在搜索问题中&#xff0c;以迷宫问题最具有代表性&#xff0c;无论是八皇后的回溯问题&#xff0c;还是dfs找出口&#xff0c;bfs找最短次数等等题目的问题。在…

ngrok服务器搭建_利用暴露在外的API,无法检测的Linux恶意软件将矛头指向Docker服务器...

K8s已经成为一线大厂分布式平台的标配技术。你是不是还在惆怅怎么掌握它&#xff1f;来这里&#xff0c;大型互联网公司一线工程师亲授&#xff0c;不来虚的&#xff0c;直接上手实战&#xff0c;3天时间带你搭建K8s平台&#xff0c;快速学会K8s&#xff0c;点击下方图片可了解…

干货 | C语言系列3——常量,运算符,常用数学函数......

符号常量和const常量1.符号常量符号常量通俗来讲就是“替换”&#xff0c;又称为宏定义。格式如下&#xff1a;#define 标识符 常量宏定义可以定义单个变量为常量&#xff0c;也可以定义某个语句或片段。宏定义有一点需要特别注意&#xff0c;它只是“机械”替换&#xff0c;并…

javafx 浏览器_浏览器中的JavaFX

javafx 浏览器浏览器中的JavaFX屏幕截图 最近&#xff0c;Carl Dea和我启动了一个新项目&#xff0c;将JavaFX 8引入浏览器。 今天&#xff0c;我想介绍我们创建的前两个概念验证&#xff0c;以查看该想法是否完全可行。 对于不耐烦的人&#xff0c;这里是到PoC的链接。 但请注…

javafx 示例_JavaFX列表示例

javafx 示例这是使用JavaFX构建的示例列表应用程序。 该应用程序是待办事项列表。 该应用程序具有添加&#xff0c;更新和删除列表中项目的功能。 列表数据存储在HSQLDB关系数据库中。 该应用程序使用JDBC&#xff08;Java数据库连接&#xff09;API访问数据库。 该应用程序打包…

嵌入式C语言的7个硬核知识

1void 与 void*void表示的是无类型&#xff0c;不可以采用这个类型声明变量或常量&#xff0c;但是可以把指针定义为void类型&#xff0c;如void* ptr。void指针可以指向任意类型的数据&#xff0c;可用任意数据类型的指针对void指针赋值&#xff0c;比如int *ptrInt&#xff1…

C语言指针用得好犹如神助!这些使用技巧值得收藏

指针用的好犹如神助&#xff0c;用不好会让你叫苦连连&#xff0c;但大多数人是用不好指针的&#xff0c;所以后来的很多语言都把指针封装&#xff0c;屏蔽。比如JAVA&#xff0c;java是没有指针的&#xff0c;但是很多地方都用到指针&#xff0c;不过不对用户开放&#xff0c;…