排序概述.ppt
排序概述,xxx,按雷滋馏蔷橙厕东搜祭关钵瓤盖友挠后超惑迁妹贪谋嫁还杯集们读诌孩皑排序概述排序概述,一、概述,数据处理的核心运算就是排序,如果数据是按关键字大小有序排列的,就可以提高处理数据的效率。排序是计算机程序中一种基础性操作,研究和掌握各种排序方法是非常重要的。排序是程序设计中一种重要的运算,功能是将一个数据元素(记录)的任意序列重新排列成一个按关键字有序的序列。,险侗匹蓄斩疡阴剖爸篡媚釜酷助憎形据均爱锤恋藩架殴窝抒优侨涧向豺寓排序概述排序概述,一、概述,排序定义:给定具有n个记录Rl,R2,Rn的文件,每个记录Ri都有一个关键字Ki(1in)且对任意两个关键字Ki和Kj都有如下关系:KiKj 或 KiKj 或 KiKj排序问题就是按照关键字值的某种关系,寻找一个排列S,使得 KS(i)KS(i+1)或 KS(i)KS(i+1)(1in-1)从而可得到文件中各记录的一种排序:(RS(1),RS(2),RS(n)。,缆玫袍榴麦逗番翔点杜邯驱产蛆径蹲徊塌悼彤稠耿缚苟海兔搜尉窝蹲蔽亩排序概述排序概述,排序就是按关键字值的递减(KS(i)KS(i+1))或递增(KS(i)KS(i+1))次序,把文件中的各记录一次排列起来,可使得一个无序的文件变成有序文件的一种操作。,一、概述,藤筑琉身祝妓易五堂士捻雨谅汾动促肌稼痉仙况苦妇虏蜕疫斜挑坛屁盛深排序概述排序概述,上述排序定义中的关键字Ki可以是记录Ri的一个关键字或者是若干数据项的组合。若Ki是唯一的,则排序后得到的结果是唯一的;果Ki是不唯一的,假设Ki=Kj,且在排序钱序列中若Ri领先于Rj,若在排序后的系列中Ri仍领先于Rj,则称所用的排序方法是稳定的;反之,若可能使排序后的序列中Rj领先于Ri,则称所用的排序方法是不稳定的。,一、概述,糟雕函就欠召来偏浴义凰檄蝗影抒夏褐涡顿载才匙宫卵伤掇恩盘浴岂捍序排序概述排序概述,在排序的过程中需要进行下列两种基本操作:(1)比较两个关键字的大小(2)将记录从一个位置移至到另一个位置。,一、概述,略今力战澈术敬盈漳诺怒沽苯前宝捡嵌粹羡沧捏企观翠辞贼守娇箭挟麻氦排序概述排序概述,要排序文记录序列,有三种常见的存储表示方法:(1)顺序结构要排序的初始文件的各个记录,按其自然顺序存放在连续的一块内存空间中。排序时要移动记录才行。(2)链式结构将要排序的每个记录(数据元素)作为链表结构存储,并按原始次序链接起来。排序时,不需要移动记录元素,而只需要修改指针。,一、概述,猪江吵究见踢屏城夫槽瞪俘噪卷绪村妊帐稽慎弊卿舆吸悠召梯友闪辜性呐排序概述排序概述,(3)地址向量结构待排序记录存放在一组地址连续的存储单元,同时另设一个指示各个记录存储位置的地址向量,在排序过程中不移动记录本身,而移动地址向量中这些记录的“地址”,在排序结束后,再按照地址向量中的值调整记录的存储位置。,一、概述,尹拨肋炊巩侵彝撤逼掌孜包惹喧土承膊吟肉贫讳咀部石哈喝痊览蜘痢询敏排序概述排序概述,内部排序整个排序过程都在内存进行的排序称为内排序。外部排序待排序的数据元素量大,以致内存一次不能容纳全部记录,在排序过程中需要对外存进行访问的排序称为外排序。,一、概述,抱倪缺衫雁垂渡约娃嚏赤御弦盅涸经雇琵玄僻诀泅隘芬樊撼伶忻分莹斧臣排序概述排序概述,二、插入排序,基本思想:在一个已排好序的记录子集的基础上,每一步将下一个待排序的记录有序地插入到已排好序的记录子集中,直到将所有待排序的记录全部插入为止。直接插入排序*折半插入排序*2路插入排序表插入排序希尔排序*,烬贬喻妈窜勘待折缴将槐宋时泄刺迅鸦疲葱晒诵稠聚撼珊碗消隘徽颁创受排序概述排序概述,1、直接插入排序,直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。插入前:(1 3 5 8)2 7 4 9 6 有序 无序 插入后:(1 2 3 5 8)7 4 9 6 有序 无序,檄筋丽娘熄陵丑触再娠胎麦喝驼闽堤烟岸皇箱析扳牡踩咙行穷枣仕掐幅襟排序概述排序概述,1、直接插入排序,初始关键字:45 62 35 77 92 55 14 35 i=2 45 62 35 77 92 55 14 35i=3 35 45 62 77 92 55 14 35i=4 35 45 62 77 92 55 14 35i=5 35 45 62 77 92 55 14 35i=6 35 45 55 62 77 92 14 35i=7 14 35 45 55 62 77 92 35i=8 14 35 35 45 55 62 77 92 图9.4直接插入排序示例,拯折阴翁婿稠查茎骄笛耻樱苹骑与彭片卧凰朴嘎诉酮唆葱沈酗霞出仓谨疲排序概述排序概述,例子:39,28,55,80,75,6,17,45,28,1、直接插入排序,抗壶办熙钨绘盏凰沁团掂揍酵旅傀芳线晃谚咏顽吹钮津邵诌繁逾阂且狡蔫排序概述排序概述,时间复杂度:O(n2)直接插入排序是稳定的排序方法。直接插入排序算法简便,比较适合于待排序记录数目较少且基本有序的情况。当待排记录数目较大时,直接插入排序的性能不是很好。下面在直接插入排序的基础上,为减少“比较”和“移动”这两种操作的次数,对排序算法进一步改进。,1、直接插入排序,俊蘸侦瑞紊逝脐坊蒂丸耙蹿县妇睹掷沽杏川诊碍予南迪骄垮疏万永美羌似排序概述排序概述,2、二分插入排序,直接插入算法虽然简单,但当记录数目比较大时,比较次数将会大大增加,对于有序表为了减少关键字的比较次数,可采用二分插入排序。基本思想:用二分查找法在有序表中找到正确的插入位置,然后移动记录,空出插入位置,再进行插入。,吕档州伐述汪衫醇洛逐椎饰鳃砷琴逛料徊谨陪盗茬榜拐钩玉斤炼枢取啄娄排序概述排序概述,若有8个记录已排序,插入新的关键字为6531 2 3 4 5 6 7 8 60 87 170 275 503 512 897 908low=1 high=8 mid=(low+high)/2=(1+8)/2=4,2、二分插入排序,剩廉摈忠犯誊恩络台牌膛口钵泥家体印楚廓木孤失惦叉格祸咬胶娠除炕高排序概述排序概述,若有8个记录已排序,插入新的关键字为6531 2 3 4 5 6 7 8 60 87 170 275 503 512 897 908 low=4 high=8 mid=(low+high)/2=(5+8)/2=6,2、二分插入排序,劈伟型节贫睹炭煤瓣滤轨异暑局坝喳怠女滨藻尼杰喳平眷棕需伶代谩撮扦排序概述排序概述,若有8个记录已排序,插入新的关键字为6531 2 3 4 5 6 7 8 60 87 170 275 503 512 897 908 low=1 high=8 mid=(low+high)/2=(7+8)/2=7,2、二分插入排序,疾广侠公益赵路鱼害复萍赌齐暴亏孺尘煎宛蘑乞唯阳或搽挺婆芒瘪怠划跳排序概述排序概述,(1)取关键字653,与序列中间位置的关键字比较,653275,在后半区找继续;(2)再与后半区中间位置的关键字比较,653512,再继续在后半区找;(3)再与后半区中间位置的关键字比较,653897,经三次比较找到插入位置,然后插入653。,2、二分插入排序,闯庐园智懦舍浓裴陌壁分封呀梭绦蜕讹周喇瞩欣穆坞铭际默椽卧拌稼漏摔排序概述排序概述,二分插入仅减少了比较次数,而记录的移动次数不变,时间复杂度仍为O(n2)。二分插入排序时稳定的排序方法。,2、二分插入排序,麓赔傣郝脯橡诧榨墟坪百鸡踩赊蚜伶赏佑宏哑樊轧荐帽泻襄纳彬酝赦悔膨排序概述排序概述,3、希尔排序,希尔排序(Shells methed)又称“缩小增量排序”,是一种基于插入思想的排序方法,但在时间效率上较前述几种排序方法有较大的改进。它利用了直接插入排序的最佳性质。,衰缸涨希园绸司桶仗阎陪复粒申董粗趣己缩骨瞄新桨敦吞晤嘻烬选调微议排序概述排序概述,将待排序的关键字序列分成若干个较小的子序列,对子序列进行直接插入排序,再改变分组进行组内排序,直到使整个待排序序列有序。在时间耗费上,较直接插入排序法的性能有较大的改进。其算法时间复杂度为O(n2),但是,若待排记录序列为“正序”时,其时间复杂度可提高至O(n)。,3、希尔排序,惭罐疤拢故抽玉液靴扁窘修炭玲尉商豫碱找腔租强艺滁凋蹭装犁套蔗半忽排序概述排序概述,3、希尔排序,基本思想:先将待排序记录序列分割成若干个“较稀疏的”子序列,分别进行直接插入排序。经过上述粗略调整,整个序列中的记录已经基本有序,最后再对全部记录进行一次直接插入排序。,雄茵皮娇络誊涛席固捧瑚缅稍戳酋撼箩母烁廓逆憾麻钡想抡好属淡贰轧椭排序概述排序概述,具体实现时,首先选定两个记录间的距离d1,在整个待排序记录序列中将所有间隔为d1的记录分成一组,进行组内直接插入排序,然后再取两个记录间的距离d2d1,在整个待排序记录序列中,将所有间隔为d2的记录分成一组,进行组内直接插入排序,直至选定两个记录间的距离dt1为止,此时只有一个子序列,即整个待排序记录序列。,3、希尔排序,眯盯忠慢采垦使后孽齐零摘避凑鼻芬邹旺龋构酵念篆蛤揖模龙店僻拙栗蛰排序概述排序概述,特点:子序列不是简单的逐段分割,而是将相隔某个“增量”的记录组成一个子序列,所以关键字较小的记录不是一步一步地前移,而是跳跃式前移,从而使得在进行最后一趟增量为1的插入排序时,序列已基本有序,只要做少量比较和移动即可完成排序,时间复杂度较低。,3、希尔排序,厚狞木和始曼番呆栏隋辕偿弃坑宾疑膨骗煞秸保警茂鞘知园复酮翁乐藻伶排序概述排序概述,3、希尔排序,图9.8 希尔排序示例,沥晾琵罕袁梭哮魄均区邹缚赐景验删擒趟谈狱宴憨鸟拣浴更敌捂蝎抚泉浆排序概述排序概述,为了分析希尔排序的优越性,引出逆转数的概念。对于待排序序列中的某个记录的关键字,它的逆转数是指在它之前比此关键字大的关键字的个数。例如:对上例中待排序序列45,62,35,77,92,55,14,25,35,72 而言,其逆转数如下:,3、希尔排序,妹划脯太壁撤连泄堆侯七定狱韶鳖剧拉犬瓢汝吉找姥尖践垣岩祈傅焊毛驳排序概述排序概述,对直接插入排序法而言:n个记录的n个关键字的逆转数之和为 N1+N2+Nn,这时逆转数之和就是排序过程中插入某一个待排序记录所需要移动记录的次数。因为,若插入第i个记录,其前必有Ni记录需要移动。这样一次比较,一次移动,每次只是减少一个逆转数。,3、希尔排序,豪呀霓她油耐洼拭束华苑泽请樟悦怀便憨恕忿棍该皑舱启钦邀饥利弯搪骋排序概述排序概述,对于希尔排序而言,一次比较,一次移动后减少的逆转数不只一个。如:上例中待排序序列在未经过希尔排序之前,它的逆转数之和为24,经过一趟希尔排序后,它的逆转数之和为10。,3、希尔排序,肪沥空宿污引痹蚁膛微湘晶糠输惶蒸厌封嗓发辐谐纯最撤捉千褪漳森育考排序概述排序概述,经过两趟希尔排序后,它的逆转数之和为4.经过三趟希尔排序后,它的逆转数之和为0.,3、希尔排序,他道景裔歌旭毡支弘趣论奸昼喂郡档叛漠忿镍烤搭贵蔫雷萤玖薛拭抠镭槐排序概述排序概述,当dk=1时,尽管一趟希尔排序相当于直接插入排序,但因为逆转数很小,所以移动次数相对于简单的直接插入排序而言也会减少。由此可见,希尔排序是一个较好的插入排序方法。希尔排序能迅速减少逆转数,尽管当间隔为1时,希尔排序相当于直接插入排序,但逆转数已经很小,序列基本有序。,3、希尔排序,少记薯淤会石奈魔哈秧钉页怂庙忽抨傍份篇蹿毯朽肃挪丫厩挝百瞳檀溅矫排序概述排序概述,在希尔排序过程中,相同关键字记录的领先关系发生变化,说明希尔排序方法是不稳定的。希尔排序的平均时间复杂度为O(n1.3)。,3、希尔排序,扼蒂惑漠佣大覆蘑越助努庇载铀旷惠帐撵霹欲械难井局倾唬撑肖沿蒜爪牺排序概述排序概述,