基数排序算法的链表实现

基数排序算法的链表实现


2024年4月30日发(作者:)

! Q: 

Science and Technology Innovation Herald 

T技术 

基数排序算法的链表实现 

敖友云 

(安庆师范学院计算机与信息学院 安徽安庆 2460 1 1) 

摘要:比较关键字和移动记录是实现算法排序的两个基本操作。在经典排序算法中,基数排序是一种不通过比较关键字实现排序的方 

法。通过示倒说明了基数排序算法的基本思想,用C程序设计语言以链表为存储结构实现了基数排序算法,并分析了基数排序算法的计算 

复杂性。 

关键词:算法 排序 基数排序 链表 

中图分类号:TP3I 2 文献标识码:A 文章编号:1674--09 8X(2011)08(b)一0023—02 

3)按百位数分配和收集数据结点,分配 

排序是计算机处理数据序列最常用的 

1基数排序算法的基本思想 

种操作。排序操作将一组无序的数据序 

列按某种次序重新排列,从而得到一组有 

序的数据序列,以方便用户的查找,提高检 

索数据的效率。下面给出排序的概念: 

定义1:设有一个由 个记录R={R lf 

=1,2…., }构成的有限序列,这 个记录对 

应的关键字序列为k={kiI =1,2…., }。 

排序就是确定1,2….,n的一种排列P。,P:, 

…,

p ,使得k k口, … kP (或k p1 

k … k ),并通过调整R中记录的位 

置,得到一个新的按关键字非递减(或非递 

增)的有序序列R’={R R ,…., }的 

过程。 

排序在处理数据序列的计算机程序中 

占用的时间较长,设计高效的排序算法是 

提高这些程序执行效率的关键。通常,排序 

算法通过两个基本操作实现对数据序列排 

序:一个是通过比较关键字来确定数据在 

数据序列中的位置次序;另一个是将数据 

从一个位置移动到另一个位置,从而调整 

数据在数据序列中的位置次序。这两个基 

本操作很大程度上决定排序算法的计算效 

率。依据算法的平均时间复杂性,将常用的 

排序算法分为三类:简单排序算法,时间复 

杂性为O(n ),例如,直接插入排序、起泡排 

序、简单选择排序;先进排序算法,时间复 

杂性为o(nlbg ),例如,希尔排序、快速排 

序、堆排序、 并排序;基数排序,时间复杂 

性为O(d・n) 基数排序在关键字个数 为 

常数时,时间复杂性D(")是线性的。基 

数排序是一种不通过比较关键字实现排序 

的方法,它借助多关键字排序的思想对单 

逻辑关键字进行排序。 

算法和数据结构是计算机程序设计和 

软件开发的基础。依据“程序=算法+数据 

结构”的观点,程序、算法和数据结构三者 

联系密切。链表是一种比较简单、实用的 

数据结构。排序算法采用链表结构实现对 

数据序列排序,进行插入或删除操作,只 

需修改指针,可以避免移动大量记录,从 

而节省时间。因此,本文首先结合实例介 

绍了基数排序算法的基本思想,然后采用 

链表结构通过程序的方式实现了基数排 

序算法,并分析了基数排序算法的计算复 

杂性。 

设有一个由RADIx个单链表组成的链 到链表集L中的数据结点的分布位置:L[0】 

表集L【 0,1,...,RADIX一1和一个由 

{8,63,83},L[1】={l09,184},L[21={269, 

RECNUM个数据元素组成的单链表Head= 

278},L[5】={505,589},L[9]={930};收集到 

{al,a2,...,aREC },每个数据元素由 

单链表Head中的数据结点的相应位置: 

KEYNUM个关键字组成,每个关键字的表 

Head={930,589,505,278,269,184,109,83, 

达式为,七KEYNLJM七KEYNUM 一 七1,0 < 

63,8}。 

RADⅨ则基数排序算法的步骤如下: 

最后,将单链表Head中的数据按逆序 

1)f=1 l 

传回给数组,得到有序数组a为{8,63,83, 

2)依据单链表Head中每个数据元素的 

l09,l 84,269,278,505,589,930}。 

第f位关键字上的数字ki,把数据结点取下 

分配 ̄URADIX个链表集L中,分配的原则是 

2基数排序算法的链表实现 

关键字ki=J的数据结点,都分配到链表 

下面给出了基数排序算法的C语言程 

L[j]中; 

序代码。程序已在VC++环境下测试通过。 

3)依次序将链表集L[i], =0,1,..., 

程序中包含下述主要模块:创建单链表 

RADⅨ一1中的全部数据结点取下收集,并 

CreateIJinkList(ArrType a)、基数排序算法 

链接这些结点构成一个新的单链表Head; 

的核心模块RadixSort(ArrType a)。 

4)f自增1,若f KEYNUM,返回2),否 

#include”stdio.h” 

则结束。 

#include”math.h” 

下面通过示例进一步说明基数排序算 

#include”malloc.h” 

法的基本思想。 

#define RADIX 10 //基数l0为 

例如,基数排序前数组a为 

十进制数 

{278,1O9,63,930,589,l84,505,269, 

#define KEYNUM 3//记录中关键 

8,83} 

字的个数 

数组a中记录的个数RECNUM=l0,基 

#define RECNUM 10//记录的个数 

数RADIx:10为十进制数,数据的最高位为 

typedef int ArrType[RECNUM】; 

百位,因此关键字的个数KEYNUM=3。首 

typedef struct LNode{//定义单链表 

先,根据数组a提供的数据元素建立一个单 

结构 

链表Head={83,8,269,505,184,589,930, 

int data; 

63,109,278}。考虑到数据元素有3个关键 

struct LNode*next; 

字,因此需要依次按个位、十位和百位在单 

}LNode,*LinkList l 

链表HeadSH链表集L之间进行分配和收集 

typedef LNode SLList[RADIX】; 

数据结点,具体过程如下: 

LinkList CreateLinkList(ArrType a) 

1)按个位数分配和收集数据结点,分配 

//创建单链表 

到链表集L中的数据结点的分布位置:L[0】 

{int i;LinkList Head,P; 

{930},L[3]={63,83},L【4】={184},L[5]= 

Head=(LNode*)malloc(sizeof(LNode)); 

{505},L[8】={278,8},L【9】={109,589,269}l 

Head->next=NULL t 

收集到单链表Head中的数据结点的相应位 

for(i=0li<RECNUMIi++){ 

置:Head={269,589,109,8,278,505,184, p=(LNode*)malloc(sizeof(LNode)); 

83,63,930}。 P一>data=a[i】l 

2)按十位数分配和收集数据结点,分配 

p->next=Head->nextlHead一> 

到链表集L中的数据结点的分布位置:L[O] 

next P; 

{505,8,109},L【3]:{930},L【6]={63,269}, } . 

L[7]={278},L【8】={83,l84,589};收集到单 

return Head; 

链表Head中的数据结点的相应位置:Head= 

} 

{589,1 84,83,278,269,63,930,l09,8, 

void RadixSort(ArrType a) 

505}。 {SLList LlLinI【List Head,p,qlint i,j,k; 

科技创新导报Science and Technology Innovation Herald 23 

!! Q:垫 

Science and Technology Innovation Herald 

T技术 

for(i=0 l i<RADIX;i++)//初始化链表 

void main() 

大而记录中关键字的个数较小的序列。 

集L {int i; 

{L[i].data=i;L[i】.next=NULL;} 

ArrType a={278,109,63,930,589, 

4结语 

Head=CreateLinkList(a)}//0]建单链表 

184,505,269,8,83}; 

与其它排序算法相比,基数排序算法 

Head 

printf(”\nThe original array:”); 

不通过比较关键字实现对序列排序,具有 

for(i=0 I i<KEYNUM;i++){ 

for(i=0;i<RECNUM;i++)printf(”%d 计算时间复杂度较低的优点。本文基数排 

//分配Head中的数据结点到L中 

a[i】)l 

序算法采用链表存储结构实现,具有思路 

p=Head->next;Head->next=NULL{ 

RadixSort(a); 

清晰、结构简单、易于扩充以及容易实现等 

while(p){ 

printf(”\nThe array has been sorted: 特点。将来的研究工作是在海量数据上对 

q=p{p=p->next l 

”); 

本文算法进一步测试,并与其它排序算法 

k=(q一>data/(int)pow(RADIX,i)) 

for(i=0;i<RECNUM;i++)printf(”%d 

进行定量比较。另外,对本文程序的核心模 

%RADIXt 

a【i】); 

块的正确性证明也是进一步的研究工作。 

q一>next=L[k].next;L[k】.next=q} 

} 

}//while 

参考文献 

//收集L中的数据结点到Head中 

3基数排序算法的计算复杂性分析 

[1]严蔚敏,吴伟民.数据结构(C语言版) 

for(j=0;j<RADIX lj++){ 

设数据序列中需要排序的记录个数为 

[M].北京:清华大学出版社.1997. 

p=L[j】.next;LD】.next=NULL; 

n,记录中关键字的个数为 ,记录中存放 

[2]徐寿芳.一种新的高效基数排序算法 

while(p){ 

的是r进制数。则基数排序过程中,初始化 

[J】.湖州职业技术学院学报.2008,(1): 

q=p;p=p->next; 

链表集L的时间复杂性为D(r),创建单链 

17~l9. 

q->next=Head->next; 

表Head的时间复杂性为D( ),d次分配 

[3]何文明.一种改进后的基数排序算法 

Head->next=q; 

与收集数据结点的时间复杂性为O(d・n), 

[J].湘潭大学自然科学学报.2004,26 

}//while 

将单链表Head中的数据结点传回数组a 

(4):34~38. 

}//for 

的时间复杂性为D( )。因此,基数排序算 

[4]卢开澄.计算机算法导引一设计与分析 

}//for 

法的时间复杂性为O(d・ )。当d为一个固 

(第2版)[M].北京:清华大学出版社. 

//释放单链表Head,并将排序结果返 定常数时,基数排序算法的时间复杂性 

2006. 

回数组a 

D( )是线性的。另外,基数排序过程中额 

[5】葛浩,杨传健.基于分布计数的基数排 

P=H ead一>next;free(H ead)l 

外用到n数据结点,每个数据结点包含一 

序方法的研究[J].计算机技术与发展. 

i:RECNUM-1 t 

个数据域和一个指针域,单链表Head用到 

2008,18(2):122~125. 

while(p){q=plp=p一>next;a[il=q-> 

个头结点,链表集L用到r个头结点。因 【6]王向阳.任意分布数据的基数分配链接 

data;free(q){i一一;} 

此,基数排序算法的辅助空间复杂性为 

排序算法【J】.计算机学报.2000,23(7): 

} 0( )。基数排序算法比较适合记录个数较 

774~778. 

(上接22页) 

用户的控制;(5)具有GSM短信、射频、红外 

两大热点话题,已经逐渐开始受到人们越 

多,比如蓝牙,WIFI,WAP……这些控制方 三种控制方式,系统稳定性提供,同时方便 

来越多的关注,因此将来应该有个不错的 

式为物联网的控制提供了技术支持,方便 用户选择合适的方式进行控制。 

发展前景。 

了用户的选择,同时多种控制方式也能提 

高系统的稳定性与可靠性。 

3物联网控制与节能技术展望 

参考文献 

2.3节能控制 

目前物联网的通信基础依旧是互联 [1】范志辉,李云龙.基于GSM的环境综合 

传统的电器元件在工作完成之后通常 

网,但是未来的物联网一定不仅仅是互联 

监控系统软件设计[J].微型电脑应用, 

不会自动断电(比如计算机完成计算任务 

网,应该更多的整合其它通信方式,比如移 

2010,26(5) 

后通常不会自动关闭)或者用户离开室内 

动网络等。其次,应建立统一的控制管理平 [2]吴红燕,潘海民,赵存华,王松德.红外 

时忘记关闭电器,等到了室外才想起来电 台。每一户家庭都有很多的电器需要控制, 

遥控调速调光节能开关的设计[J】.煤矿 

源还未切断,这种情况下传统的电器还会 因此电器控制这一方面未来也会呈现出巨 机械,2009,30(3) 

继续消耗电能。使用我们设计的家用节能 大的市场,为了提高管理的效率,建立统一 

[3]陈庆霆,武林.基于GSM的分布式稻田 

开关系统配合电器一起使用,当用户忘记 的控制管理平台,可以由用户为各个电器 

水位远程监控系统[J】.仪器仪表学报, 

关闭电源到室外又想来的时候,可以发送 设定具体的运行参数,平台对各电器运行 

2009,30(6) 

指令MSETOFF给指定的号码,GSM短信模 

的状况进行检测控制,还要考虑安全等因 [4]杨仁渊.基于GSM的远程控制报警系统 

块收到指令后,便会将连接在上面的电器 素。第三,应融入更多的传感控制技术。我 

[J].2l世纪人才培养,2008,1 5(4). 

元件的电源断开达到节能的目的;或者在 

们设计的家用节能控制系统中只简单地应 

[5】宜彩平,王皓,邹国良.利用GSM无线模 

启动模块的时候使用指令MSETON40,这 

用了红外、短信、射频控制技术,其实还有 块发送短消息 .计算机应用,2004,24 

里的“4O”表示电器工作4O分钟后自动断电, 

很多其它的控制技术来实现控制,比如说 

(5). 

从而达到节能的目的。 蓝牙,WIFI,WAP等控制方式,但是不同的 

【6】颜志国,唐前进.物联网技术在智能交 

2.4创新点 . 

控制方式要考虑系统运行的稳定性、可靠 

通中的应用[J】.警察技术,2010:l1. 

(1)设计的家用节能开关系统适用于不 

性和系统设计及运行的成本等因素。节能 [7]蒋林涛.互联网与物联网【J】.电信工程 

同类型家庭电器,适用性较强;(2)系统操作 

方面可以通过设定更恰当的判定规则来实 

技术与标准化,2010(2). 

和控制简便,用户可以非常容易地学习、使 

现,比如当外界的条件满足什么样的条件 

用;(3)系统可以实现无接触控制电路的通 

时触发系统自动切断用电器的电源。 

断,安全,便捷,(4)系统具有延时功能,方便 

总体来说,物联网和节能技术目前的 

24 科技创新导报Science and Technology Innovation Herald 


发布者:admin,转转请注明出处:http://www.yc00.com/news/1714446223a2448051.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信