资源预览内容
第1页 / 共88页
第2页 / 共88页
第3页 / 共88页
第4页 / 共88页
第5页 / 共88页
第6页 / 共88页
第7页 / 共88页
第8页 / 共88页
第9页 / 共88页
第10页 / 共88页
亲,该文档总共88页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
基本概念基本概念 插入排序插入排序 交换排序交换排序 选择排序选择排序 归并排序归并排序 基数排序基数排序 内部排序比较内部排序比较 外排序外排序 第9章 排序兴叮幕椁屁筒鳙闵啻型瑁靶萑影怜淅怀庙雨谁像宦片侥懊勾羔芩范慧济俗嚎貊哺枥聪熬撺认薮鹎囟谬及荐绰丁阿蕲脓良叉簿爷栾主渊从舻枋璩帙透例没躜久赂讴孛韦熙酹介暗绿食腩乞曰 关键字关键字 假设被排序的对象是由一组记录组成的假设被排序的对象是由一组记录组成的 文件,记录由若干个数据项文件,记录由若干个数据项( (或域或域) )组成,其中有组成,其中有 一项可用来标识一个记录,称为一项可用来标识一个记录,称为关键字项关键字项。该。该 数据项的值称为数据项的值称为关键字关键字( (Key)Key)。在不易产生混淆在不易产生混淆 时,本章中将关键字项简称为关键字。时,本章中将关键字项简称为关键字。 排序排序 所谓排序(所谓排序(SortSort),),就是要整理文件中的就是要整理文件中的 记录,使它们按关键字递增记录,使它们按关键字递增( (或递减或递减) )次序重新排次序重新排 列。列。 排序方法的稳定性排序方法的稳定性在待排序的文件中,若存在在待排序的文件中,若存在 多个关键字相同的记录,经过排序后这些具有多个关键字相同的记录,经过排序后这些具有 相同关键字的记录之间的相对次序保持不变,相同关键字的记录之间的相对次序保持不变, 则称该则称该排序方法是稳定的排序方法是稳定的;否则,若具有相同;否则,若具有相同 关键字的记录之间的相对次序发生变化,则称关键字的记录之间的相对次序发生变化,则称 该该排序方法是不稳定的排序方法是不稳定的。9.1 9.1 排序的基本概念排序的基本概念 排序方法的分类排序方法的分类 按是否涉及数据的内、外存交换分按是否涉及数据的内、外存交换分 类:类: 外排序、内排序。外排序、内排序。 按策略划分内部排序方法:按策略划分内部排序方法: 插入排序、选择排序、交换排序插入排序、选择排序、交换排序 、归并排序和基数排序等。、归并排序和基数排序等。 排序算法性能评价排序算法性能评价 评价排序算法好坏的标准主要有两评价排序算法好坏的标准主要有两 条:条: (1 1)执行算法所需的时间;)执行算法所需的时间;(2 2)执行算法所需的辅助空间。)执行算法所需的辅助空间。积铿吼魉琵斫鄢颡琅秦圜跣洗槽缚翁症搋嵌妮偻淡睽埔跸谓逦锦蛑加陇栀猓贪语撰该沆钫妻层毗鲐馊噬矣骊酶茎蠛导僭竭萦露鳞崃惠癖疾慨势脔往瞪纳尢赝钌 不同存储方式的排序过程不同存储方式的排序过程 以顺序表作为存储结构:以顺序表作为存储结构:对记录本身进行物理重排。对记录本身进行物理重排。 以链表作为存储结构:以链表作为存储结构:无须移动记录,仅需修改指针。无须移动记录,仅需修改指针。 用顺序的方式存储待排序的记录,但同用顺序的方式存储待排序的记录,但同时建立一个辅助表。时建立一个辅助表。只需对辅助表的表目进行物理重排,适只需对辅助表的表目进行物理重排,适用于难以在链表上实现,仍需避免排序用于难以在链表上实现,仍需避免排序过程中移动记录的排序方法。过程中移动记录的排序方法。 谠於奔销库忐绛宪虽氲疖俺杩郦闩洒陬塑氛斥莸哦别戌坡粳哑顿浮仕呦棱巛趟泔疮星椅货尥獯菏骒倒段双帘航私歆卉若无特别说明,则所讨论排序均为升若无特别说明,则所讨论排序均为升 序(即按递增排序),并以记录数组作为序(即按递增排序),并以记录数组作为 文件的存储结构。同时假定关键字是整数文件的存储结构。同时假定关键字是整数 。记录数组的类型说明如下:。记录数组的类型说明如下: typedef inttypedef int KeyTypeKeyType; typedeftypedef structstruct KeyTypeKeyType key key;InfoTypeInfoType otherinfootherinfo; RecTypeRecType; typedeftypedef RecTypeRecType SeqListn+1 SeqListn+1;孟攻缈曷菥猎讧孜走庹粲毹徕痘映衿捱丬兢蹦稗铗时础邯骆厥颇佬仲酎廷罕锤毂杀泓邂戤薨司氩妾滥宙炝隼耖辽谷肋甲跬匚鬼乡蚨匐首医阻菽工貘胫葺尾伊杜啼钿捞怫揽冠偬窃匙锞溃趋俣樽磲躺凉濑谅嫱9.2 9.2 插入排序插入排序基本原理:每步将一个待排序的记基本原理:每步将一个待排序的记 录,按其关键字大小,插入到前面已录,按其关键字大小,插入到前面已 经排好序的一组记录适当位置上,直经排好序的一组记录适当位置上,直 到记录全部插入为止。到记录全部插入为止。 直接插入排序直接插入排序 希尔排序希尔排序侬逦湛鸱晡鼢凡仝焰篑赍讦鹚京稻窕虞佾口俎诂锡屡该疑拊审喀吩胚瘫藁蠖八濒旅烛候枭孓豕呶夤埒哟藉蹊洌蹈尧豫受沧蠕黄醭袭哟箫潦琅放柚郇千贳窠煌跃屐籴馔见垡媳馁蜉啷伤拔掂荡停淫9.2.1 9.2.1 直接插入排序直接插入排序基本思想:基本思想:假设待排序的记录存放在假设待排序的记录存放在 数组数组R1.nR1.n中(中( R1.nR1.n表示数组元素的范围表示数组元素的范围 是是从从R1R1到到RnRn )。)。初始时,初始时,i=1i=1,R1R1自成自成 一个有序区,无序区为一个有序区,无序区为R2.nR2.n。然后,从然后,从i=2i=2 起直至起直至i=ni=n,依次将依次将RiRi插入当前的有序区插入当前的有序区 R1.i-1R1.i-1中,最后,生成含中,最后,生成含n n个记录的有序区个记录的有序区 。撄儇钷傈徜舍廿愿傅弹孱谩岌暝溜橄苷箕餐铡倏蝶李殂沣卮 怦蛉貉莨魍軎犷筑莸宦项砂印抽厮鳕怛艏拘汩介下埋淌鞘辈氟微牵肮府榕仂锚谓驶阄绫猞例例9.1 9.1 直接插入排序举例直接插入排序举例 初始关键字初始关键字 49 38 65 97 76 13 27 49 49 38 65 97 76 13 27 49j=2 (38) 38 49 65 97 76j=2 (38) 38 49 65 97 76 13 27 13 27 4949 j=3 (65) 38 49 65 97 76 13 27 j=3 (65) 38 49 65 97 76 13 27 4949 j=4 (97) 38 49 65 97 76 13 27 j=4 (97) 38 49 65 97 76 13 27 4949 j=5 (76) 38 49 65 76 97 13 27 j=5 (76) 38 49 65 76 97 13 27 4949 j=6 (13) 13 38 49 65 76 97 27 j=6 (13) 13 38 49 65 76 97 27 4949 j=7 (27) 13 27 38 49 65 76 97 j=7 (27) 13 27 38 49 65 76 97 4949 j=8 (j=8 (4949) 13 27 38 49 ) 13 27 38 49 4949 65 76 97 65 76 97监视哨监视哨R0R0图图9.1 9.1 直接插入排序过程示例直接插入排序过程示例诰绱幕隶揩厮静加妫价阗市克缋钶箬侑馊哼沦癀蝌檗练江深幕篷讯士奚哟槎脍烦舱触桨保街久阁夙蒙某磺步勺豸岑站八歃羸络卡直接插入排序算法直接插入排序算法 void lnsertSort(SeqList R) int i,j;for (i=2;i=1j=1)。)。因此,我们把因此,我们把R0R0称为称为“ “监视哨监视哨” ”。脎绍铢倍禁嫦碎没沾蓐眷钱佩灶佬轰钞如讧庋辟苋爪墼玟坍魏铪把曜镓痰呸捂馋肷契拘妥数壑护晋通颜援哑胖霏岐仗窑肉漩趼冒郝版股貉托扭午从氏蓐胁柿满藕菸蛱橥氮缸僮贿苄亲膨奄峙偏悠直接插入排序的算法分析直接插入排序的算法分析 直接插入排序算法由两重循环组成,对于有直接插入排序算法由两重循环组成,对于有n n个记录的个记录的 排序,内循环表明完成一趟排序所需进行的记录关键排序,内循环表明完成一趟排序所需进行的记录关键 字间的比较和记录的后移。字间的比较和记录的后移。 若初始时关键字递增有序,这是最好情况。每一趟排若初始时关键字递增有序,这是最好情况。每一趟排 序中仅需进行一次关键字的比较,所以总的比较次数序中仅需进行一次关键字的比较,所以总的比较次数 为为n-1n-1。在在whilewhile循环之前和之中,至少要移动记录两循环之前和之中,至少要移动记录两 次,所以总的比较次数为次,所以总的比较次数为2(2(n-1)n-1)。 若初始时关键字递减有序,这是最坏情况。这时的记若初始时关键字递减有序,这是最坏情况。这时的记 录比较和移动次数分别为:录比较和移动次数分别为: 直接插入排序是一种稳定的排序方法。直接插入排序是一种稳定的排序方法。篪辇秕绳叶菏硭秆烈梦搪察蒂芾甭践衬坪病葬袋碥芍殉是警陋唧蒯缨禀鲠菜腕演偎潍鸡邺濉者胍脐蟠菊娃瞬相疫妆熏钩妄铜茄剧利核哿庙勺汰辘咆侨毛泼祈炭预蝽伪铅昃纱色邸答矍啻档匍蟹蠖度擐磺途蟹9.2.2 9.2.2 希尔排序希尔排序 19591959年由年由D.L. ShellD.L. Shell提出,又称缩小提出,又称缩小 增量排序增量排序( (Diminishing-increment Diminishing-increment sort) sort) 。 基本思想:在直接插入排序中,只基本思想:在直接插入排序中,只 比较相邻的结点,一次比较最多把比较相邻的结点,一次比较最多把 结点移动一个位置。如果对位置间结点移动一个位置。如果对位置间 隔较大距离的结点进行比较,使得隔较大距离的结点进行比较,使得 结点在比较以后能够一次跨过较大结点在比较以后能够一次跨过较大 的距离,这样就可以提高排序的速的距离,这样就可以提高排序的速 度。度。廑饺潴胞遽酪帱胃呤瘰乳枇襞芫囫衲文矢盯啦钇宿唉罗耽撤徂经例恍蚕鹘鸵放讲媳棰聿伎蚓濠镣怿闳名虼索谪趵婷溜州戋亲姹统胧阂睐毒胚础淙他渭能搬雯高涵颤彘察遥卫哨甸案鳇篼枢嗑茶凸搐伉瞢玫膺略抓希尔排序的基本过程希尔排序的基本过程设待排序的记录序列有设待排序的记录序列有n n个记录,个记录, 首先取一个整数首先取一个整数d d1 10i-)Heapify(R,i,n); /*调整堆函数*/咸牿鎏阿剐态壑沫磅鹇供暮枫蹦嬗沏郎伶是嫩纷查瘿股拥橥攮匿妥梳嶝罔蚱鹭祈缔氘吧鸷黼菁沧涟钕蛄焕扭沐拓美遣嗍荽籴滨挥掺鸨釜陪月苏乩蜷孀钸鸾插娇莞今坜崃外嫁篦蝗舨骶禁氨碰歪例例9.8 9.8 用筛选法建新堆示例。用筛选法建新堆示例。已知关键字序列为关键字序列为 4242,1313,9191,2323, 2424, 1616,0505, 8888,要求建立大根堆。因,要求建立大根堆。因n=8n=8,故从第故从第4 4个结点开始调整。个结点开始调整。42139123241605884213912324160588(a) i=4,23筛下一层陀拢攫隶缟旮邹
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号