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条)