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;编译系统将按照一定的规则自动完成。而强制类型转换是由程序员通过编程强制转换数据的类型。自动转换的规则…

jdk 9和jdk8_JDK 9 –给圣诞老人的信?

jdk 9和jdk8众所周知&#xff0c;冬天&#xff08;尤其是圣诞节前的时间&#xff09;是做梦的合适时机&#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与java ee_Java EE 8怎么了?

java与java eeJava EE 8的工作进展顺利。 是时候赶上了&#xff01; 无需费力就可以潜入… 不要忘记Java EE 7….. 围绕三个重要主题 HTML 5对齐–用于WebSocket的Java API&#xff08;JSR 356&#xff09;&#xff0c;JSON处理&#xff08;JSR 353&#xff09;&#xff0c;JA…

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;它们与无状…

java interestops_Java Channel.setInterestOps方法代码示例

import org.jboss.netty.channel.Channel; //导入方法依赖的package包/类protected void doConnect() throws Throwable {long start System.currentTimeMillis();ChannelFuture future bootstrap.connect(getConnectAddress());try{boolean ret future.awaitUninterruptibl…

python时间间隔循环_python循环间隔

广告关闭回望2020&#xff0c;你在技术之路上&#xff0c;有什么收获和成长么&#xff1f;对于未来&#xff0c;你有什么期待么&#xff1f;云社区年度征文&#xff0c;各种定制好礼等你&#xff01;序言如图1.1中关于如何用python去计算两个时间(年月日)相隔多少天&#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找最短次数等等题目的问题。在…

ejb运行程序_在哪里可以运行EJB?

ejb运行程序EJB不仅为Java EE应用服务器而建。 他们还可以执行在的Java EE Web Profile的容器或简单的Java SE环境&#xff08;Java SE的啊- &#xff01;E&#xff01;ASY 的J ava 乙是指合同&#xff09;。 EJB Lite 仅支持完整的EJB规范提供的功能的子集所必需的-相同功能的…

css vue 选项卡_vuejs实现标签选项卡动态更改css样式的方法

html{{item.name}}jsvar app new Vue({el:"#app",router,data:{m:"hello vue.js",active:2,idx:0, //默认选择首页headerList:[{name:首页1},{name:首页2},{name:首页3},{name:首页4},{name:首页5},{name:首页6}]},methods:{// 1.选择selectMainTheme:fun…