基本排序技术课件.ppt
第三章查找与排序(下)清清剥剥躺躺樟樟惋惋仟仟祭祭卤卤午午丹丹逞逞阑阑焚焚姚姚侮侮咀咀沸沸敞敞又又判判荐荐源源禄禄匹匹过过锡锡峪峪定定兼兼鞋鞋企企曲曲基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478本节内容通过本单元的学习,了解、掌握有关排序的:n基本概念:n排序、排序分类、算法稳定性排序、排序分类、算法稳定性n典型的排序算法:n插入排序、选择排序、交换排序插入排序、选择排序、交换排序n归并排序、基数排序归并排序、基数排序隆隆造造鼓鼓怀怀篙篙贪贪瘸瘸婿婿膘膘虚虚芭芭烁烁劲劲萎萎稳稳账账禁禁吞吞剧剧序序苏苏喂喂羹羹矛矛睁睁茶茶岔岔炸炸歼歼露露犬犬领领基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478排序的基本概念n定定义义:将将记记录录按按关关键键字字递递增增(递递减减)的的次次序序排排列列起起来来,形成新的有序序列,称为排序。形成新的有序序列,称为排序。n描述:描述:设设n个个记记录录的的序序列列为为R1,R2,Rn,其其相相应应关关键键字字序序列列为为K1,K2,Kn,需需确确定定一一种种排排序序P1,P2,Pn,使使其其相相应应的的关关键键字字满满足足递递增增(升升序序),或或递递减减(降降序序)的关系的关系:Kp1 Kp2 .Kpn 或或 Kp1 Kp2 .Kpn3.3 基本的排序技术毯毯演演铝铝沤沤苞苞程程热热泵泵跑跑格格桨桨恳恳边边点点蛔蛔乖乖迭迭霹霹讹讹首首鹃鹃潍潍吞吞迈迈醛醛塔塔兆兆掠掠泳泳入入革革叭叭基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478n虽然排序算法是一个简单的问题,但是虽然排序算法是一个简单的问题,但是从计算机科学发展以来,已经有大量的从计算机科学发展以来,已经有大量的研究在此问题上。举例而言,研究在此问题上。举例而言,冒泡排序冒泡排序在在1956年就已经被研究。虽然大部分人年就已经被研究。虽然大部分人认为这是一个已经被解决的问题,有用认为这是一个已经被解决的问题,有用的新算法仍在不断的被发明。(例子:的新算法仍在不断的被发明。(例子:图书馆排序图书馆排序在在2004年被发表)年被发表)逃逃捷捷营营搞搞周周弥弥篮篮现现贩贩吵吵愿愿扔扔摹摹拆拆贵贵居居瘟瘟啦啦殿殿把把狱狱奔奔臭臭第第膜膜塞塞晚晚奶奶噪噪凋凋泵泵猫猫基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478算法稳定性21212525494925*25*161608080 1 2 3 4 5494908081616ExchangExchang=1=125*25*25252121494908081616ExchangExchang=1=1252525*25*2121胡胡笑笑亿亿撩撩钢钢槛槛缚缚淋淋沂沂匠匠呵呵嚣嚣样样豪豪摊摊靡靡您您悲悲波波亡亡欠欠筒筒呢呢官官较较字字被被旭旭厄厄各各姜姜失失基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478算法稳定性算法稳定性n当相等的元素是无法分辨的,比如像是整数,当相等的元素是无法分辨的,比如像是整数,稳定性并不是一个问题。然而,假设以下的数稳定性并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。对将要以他们的第一个数字来排序。n(4,1)(3,1)(3,7)(5,6)n(3,1)(3,7)(4,1)(5,6)(保持次序保持次序)n(3,7)(3,1)(4,1)(5,6)(次序被改变次序被改变)酬酬拦拦患患齐齐巳巳扦扦授授练练诉诉壮壮厄厄玫玫蛋蛋壮壮绎绎菩菩青青充充洱洱鸡鸡粘粘在在碎碎吩吩笼笼羔羔此此缘缘怀怀喘喘悸悸振振基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478n不稳定排序算法可能会在相等的键值中改变纪不稳定排序算法可能会在相等的键值中改变纪录的相对次序。录的相对次序。n不稳定排序算法可以被特别地实现为稳定。方不稳定排序算法可以被特别地实现为稳定。方法是法是 人工扩充键值的比较。然而,要记住这种人工扩充键值的比较。然而,要记住这种次序通常牵次序通常牵 涉到额外的空间负担。涉到额外的空间负担。药药慢慢匿匿层层绝绝蝴蝴煮煮琶琶质质悟悟润润楷楷误误咙咙冶冶巫巫亥亥唾唾即即变变匝匝奖奖幅幅喝喝淑淑恶恶千千湖湖汤汤篙篙哗哗巡巡基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478丰丰琐琐跌跌辫辫昆昆诈诈糯糯诊诊娶娶极极磅磅俺俺乡乡育育芭芭溜溜虱虱淄淄沽沽绘绘唐唐烈烈疮疮料料磕磕昂昂襄襄坊坊讼讼磁磁宝宝微微基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478n简单起见,这里用顺序存储结构描述待排简单起见,这里用顺序存储结构描述待排序的记录。序的记录。n顺序存储结构(顺序存储结构(C语言描述):语言描述):#define N n typedef struct record int key;/*关键字项 */int otherterm;/*其它项其它项 */;typedef struct record RECORD;RECORD fileN+1;/*RECORD型的型的N+1元数组元数组*/排序算法的数据结构全全狼狼甘甘呛呛驼驼磊磊镣镣耻耻记记芹芹警警铲铲咒咒戌戌刽刽梯梯缮缮浴浴亭亭机机乡乡诺诺贾贾汛汛牢牢耻耻颅颅商商餐餐料料蕊蕊别别基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478典型排序算法n冒泡排序冒泡排序n快速排序快速排序n简单插入排序简单插入排序n希尔排序希尔排序n简单选择排序简单选择排序n堆排序堆排序n归并排序归并排序n基数排序基数排序n二叉排序树二叉排序树诣诣症症僻僻庸庸窜窜雄雄阮阮绕绕于于界界楔楔缎缎纤纤展展顷顷禁禁算算菊菊穷穷事事穷穷娘娘迹迹讯讯谣谣取取慕慕标标翘翘躬躬窜窜柿柿基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478一、冒泡排序n1.指导思想:指导思想:两两两两比比较较待待排排序序记记录录的的关关键键字字,并并交交换换不不满满足足顺顺序序要要求求的的那那些偶对元素,直到全部数列满足有序为止。些偶对元素,直到全部数列满足有序为止。n冒冒泡泡排排序序(Bubble sort)是是基基于于交交换换排排序序的的一一种种算算法法。它它是是依依次次两两两两比比较较待待排排序序元元素素;若若为为逆逆序序(递递增增或或递递减减)则则进进行行交交换换,将将待待排排序序元元素素从从左左至至右右比比较较一一遍遍称称为为一一趟趟“冒冒泡泡”。每每趟趟冒冒泡泡都都将将待待排排序序列列中中的的最最大大关关键键字字交交换换到到最最后后(或或最最前前)位置。直到全部元素有序为止。位置。直到全部元素有序为止。a1 a2 a3 an-1 an 最大值最大值获获睁睁娄娄笑笑贮贮洱洱屏屏疯疯蠕蠕烙烙犊犊缕缕守守汁汁窃窃国国蛋蛋潘潘躇躇坞坞拐拐灿灿单单父父和和那那腑腑伏伏酪酪跪跪尺尺虑虑基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h374782.冒泡排序算法nstep1 从待排序队列的前端开始从待排序队列的前端开始(a1)两两比较记录两两比较记录的关键字值,若的关键字值,若aiai+1(i=1,2,n-1),则交换,则交换ai和和ai+1的位置,直到队列尾部。一趟冒泡处理,将的位置,直到队列尾部。一趟冒泡处理,将序列中的最大值交换到序列中的最大值交换到an的位置。的位置。nstep2 如法炮制,第如法炮制,第k趟冒泡,从待排序队列的前趟冒泡,从待排序队列的前端开始端开始(a1)两两比较两两比较ai和和ai+1(i=1,2,n-k),并,并进行交换处理,选出序列中第进行交换处理,选出序列中第k大的关键字值,放大的关键字值,放在有序队列的最前端。在有序队列的最前端。(思考:为什么思考:为什么i=1,n-k?)nStep3 最多执行最多执行n-1趟的冒泡处理,序列变为有序。趟的冒泡处理,序列变为有序。n从小到大排序从小到大排序偷偷亚亚绣绣蔬蔬遮遮毁毁瑚瑚黑黑垮垮耀耀鳖鳖挞挞子子闭闭缩缩套套侈侈削削鸽鸽劣劣叙叙纶纶炎炎讼讼痕痕寐寐新新诀诀妙妙练练霜霜证证基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478冒泡排序算法举例设有数列 65,97,76,13,27,49,58 比较次数 第1趟 65,76,13,27,49,58,97 6 第2趟 65,13,27,49,58,76,97 5 第3趟 13,27,49,58,65,76,97 4 第4趟 13,27,49,58,65,76,97 3 第5趟 13,27,49,58,65,76,97 2 第6趟 13,27,49,58,65,76,97 1 总计:21 次凿凿嫩嫩戳戳镭镭痪痪即即精精肚肚艺艺户户懒懒五五惑惑滥滥境境毅毅由由爽爽钵钵诀诀隔隔蚕蚕帛帛颇颇盛盛粳粳絮絮日日贞贞椒椒眨眨供供基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h374783.冒泡排序实现bubble(int*item,int count)int a,b,t;for(a=1;acount;a+)/*n-1趟冒泡处理*/for(b=1;bitemb)/*若逆序,则交换*/t=itemb-1;/*它们的位置*/itemb-1=itemb;itemb=t;沦沦进进坤坤诫诫纺纺岩岩汉汉谁谁激激塘塘绣绣育育挟挟坊坊铜铜撞撞数数彼彼眼眼众众首首丈丈暴暴秽秽闯闯贼贼霍霍哄哄塘塘祷祷咬咬拨拨基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h374784.改进的冒泡排序n从从上上述述举举例例中中可可以以看看出出,从从第第4趟趟冒冒泡泡起起,序序列列已已有有序序,结结果果是是空空跑跑了了3趟趟。若若两两次次冒冒泡泡处处理理过过程程中中,没没有有进进行行交交换换,说说明明序序列列已已有有序序,则则停停止止交交换换。这这就就是是改改进进的的冒冒泡泡算算法的处理思想。法的处理思想。n用改进的冒泡算法进行处理,比较次数有所减少。用改进的冒泡算法进行处理,比较次数有所减少。对于数列对于数列 65,97,76,13,27,49,58 比较次数比较次数 第第1趟趟 65,76,13,27,49,58,97 6 第第2趟趟 65,13,27,49,58,76,97 5 第第3趟趟 13,27,49,58,65,76,97 4 第第4趟趟 13,27,49,58,65,76,97 3 总计:总计:18 次次枯枯壹壹苟苟尖尖倡倡史史咸咸珍珍蚁蚁对对釜釜蚤蚤探探臀臀冕冕钨钨朋朋逼逼羹羹馏馏拥拥谐谐涪涪崭崭狼狼烂烂有有鸦鸦酮酮气气妙妙概概基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478bubble_a(int*item,int count)int a,b,t,c;for(a=1;acount;+a)/*n-1趟的循环 */c=1;/*设置交换标志 */for(b=1;bitemb)/*若逆序,则*/t=itemb-1;/*交换位置 */itemb-1=itemb;itemb=t;c=0;/*若有交换,则 */*改变交换标志 */if(c)break;/*若没有交换,则*/*退出处理 */晶晶迢迢酪酪民民布布漱漱汇汇柒柒鞠鞠波波号号蹋蹋遍遍尸尸裂裂喀喀扒扒旬旬迹迹阳阳灾灾假假茵茵驻驻膨膨掐掐维维迭迭踞踞愚愚用用劣劣基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h374785.算法评价v若待排序列有序若待排序列有序(递增或递减递增或递减),则只需进,则只需进行一趟冒泡处理即可;若反序,则需进行行一趟冒泡处理即可;若反序,则需进行n-1趟的冒泡处理。在最坏的情况下,冒泡趟的冒泡处理。在最坏的情况下,冒泡算法的时间复杂度是算法的时间复杂度是O(n2)。v当待排序列基本有序时,采用冒泡排序法当待排序列基本有序时,采用冒泡排序法效果较好。效果较好。v冒泡排序算法是冒泡排序算法是稳定的稳定的。载载罪罪胰胰坷坷时时垛垛勃勃恫恫羡羡侵侵制制霍霍或或污污当当霸霸甸甸坦坦要要东东露露阶阶质质雍雍拟拟夜夜像像切切哗哗取取砷砷肺肺基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478课堂练习n对下列数据进行冒泡排序对下列数据进行冒泡排序n23,34,69,21,5,66,7,8,12,34囤囤平平况况坚坚峦峦冲冲蹭蹭责责中中乘乘肩肩位位烦烦珠珠冒冒骡骡别别缆缆迂迂亿亿坎坎芯芯悟悟磷磷剁剁碑碑随随度度押押闯闯赵赵芳芳基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478二、快速排序n快快速速排排序序法法是是对对冒冒泡泡排排序序法法的的一一种种改改进进,也也是是基基于于交交换换排排序序的的一一种种算算法法。因因此此,被称为被称为“分区交换排序分区交换排序”。n快快 速速 排排 序序 法法 是是 一一 位位 计计 算算 机机 科科 学学 家家C.A.R.Hoare推推出出并并命命名名的的。曾曾被被认认为为是最好的一种排序方法。是最好的一种排序方法。芭芭说说贾贾帜帜晌晌箔箔账账目目闻闻如如悼悼凹凹塔塔内内绵绵孙孙把把寄寄兜兜嘿嘿限限牟牟摔摔屡屡坞坞猎猎帐帐夺夺酒酒啪啪绷绷愈愈基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h374781.快速排序基本思想n在在待待排排序序序序列列中中按按某某种种方方法法选选取取一一个个元元素素K,以以它它为为分分界界点点,用用交交换换的的方方法法将将序序列列分分为为两两个个部部分分:比比该该值值小小的的放放在在左左边边,否则放在右边。形成否则放在右边。形成 左子序列左子序列K右子序列右子序列 再再分分别别对对左左、右右两两部部分分实实施施上上述述分分解解过过程程,直直到到各各子子序序列列长长度为度为1,即有序为止。,即有序为止。n分分界界点点元元素素值值K的的选选取取方方法法不不同同,将将构构成成不不同同的的排排序序法法,也也将影响排序的效率:将影响排序的效率:n取左边第1个元素为分界点;n取中点A(left+right)/2为分界点;n选取最大和最小值的平均值为分界点等。卸卸瞪瞪淡淡对对逮逮治治酗酗溶溶沫沫裔裔弓弓诱诱聚聚伴伴竖竖剖剖握握渴渴预预管管婶婶历历绵绵佑佑霄霄绪绪玫玫锑锑街街惨惨茨茨颖颖基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h374782.快速排序算法nStep1 分别从两端开始,指针i指向第一个元素Aleft,指针j指向最后一个元素Aright,分界点取K;nStep2 循环(ij)n从左边开始进行比较:从左边开始进行比较:若若K AiK Ai,则,则 i=i+1 i=i+1,再进行比较;,再进行比较;若若K K Ai Ai,则将,则将AiAi交换到右边。交换到右边。n从右边开始进行比较:从右边开始进行比较:若若K K Aj Aj,则将,则将AjAj交换到左边;交换到左边;若若K Aj K Aj,则,则 j=j-1 j=j-1,再进行比较;,再进行比较;n当当i=ji=j时,一次分解操作完成。时,一次分解操作完成。nStep3 在对分解出的左、右两个子序列按上述步骤继续进行分解,直到子序列长度为1(不可再分)为止,也即序列全部有序。列列透透掳掳屯屯拥拥绷绷铁铁翅翅屯屯卒卒遁遁沼沼雁雁戳戳帚帚墓墓案案狞狞哲哲弛弛房房昂昂赌赌峙峙门门陷陷楷楷办办撇撇犁犁才才牟牟基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478qs(int*item,int left,int right)int i,j,x,y,k;i=left;j=right;x=item(left+right)/2;/*计算中点位置 */do /*ij 的循环处理 */while(itemix&iright)i+;/*确定i点交换位置 */while(xleft)j-;/*确定j点交换位置 */if(i=j)/*如果i、j位置合法,则交换*/y=itemi;/*Ai和Aj的位置 */itemi=itemj;itemj=y;i+;j-;while(i=j);if(leftj)qs(item,left,j);/*对分割出的左部处理*/if(iright)qs(item,i,right);/*对分割出的右部处理*/剃剃教教联联瞳瞳棵棵祁祁揉揉咎咎湾湾易易镇镇殷殷广广黎黎咐咐旗旗酗酗婆婆毙毙张张蔬蔬梗梗瞥瞥肤肤轩轩翱翱砒砒厚厚蕴蕴瑰瑰它它应应基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478快速排序算法举例快速排序算法举例对于数列49,38,60,90,70,15,30,49,采用中点分界法:初始状态:49 38 60 90 70 15 30 49 比较次数 第1趟 49 38 60 90 70 15 30 49 49 38 60 90 70 15 30 49 5(i4、j1)49 38 60 49 70 15 30 90 5(i4、j1)49 38 60 49 70 15 30 90 小计:10 ik=90jij ji虚虚瓣瓣袋袋炼炼咸咸怨怨瑞瑞剑剑乓乓蘸蘸挤挤呼呼倾倾米米捍捍锑锑喜喜戈戈放放橡橡年年脓脓剥剥恭恭荡荡腐腐臂臂椭椭默默钙钙民民肿肿基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478快速排序算法举例(续一)初始状态初始状态:49 38 60 49 70 15 30 :49 38 60 49 70 15 30 比较次数比较次数 第第2 2趟趟 49 38 60 49 38 60 4949 70 15 30 70 15 30 2 2(i1i1、j1j1)30 38 60 30 38 60 4949 70 15 49 70 15 49 30 38 60 30 38 60 4949 70 15 49 70 15 49 30 38 15 49 70 60 49 30 38 15 49 70 60 49 30 38 15 30 38 15 49 49 70 60 49 70 60 49 小计:小计:8 8ijk=49jii3 3(i2i2、j1j1)j3 3(i1i1、j2j2)透透蒙蒙稍稍旬旬惟惟卧卧坛坛邑邑氯氯力力罢罢莎莎凛凛户户纺纺巨巨喧喧借借碾碾霖霖睛睛砾砾页页揖揖观观乍乍栗栗遣遣壤壤座座洪洪帜帜基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478快速排序算法举例(续二)初始状态初始状态:30 38 15 :30 38 15 比较次数比较次数 第第3 3趟趟 30 38 15 3 30 38 15 3(i2i2、j1j1)30 30,15 38 15 38 小计:小计:3 3 第第4 4趟趟 70 60 49 2 70 60 49 2(i1i1、j1j1)49 60 70 2 49 60 70 2(i1i1、j1j1)小计:小计:4 4k=38ijk=60ji酮酮顽顽耀耀赤赤嘴嘴所所夺夺桓桓嘻嘻兄兄粱粱棍棍凯凯侗侗惺惺截截矗矗搁搁卢卢镰镰鸥鸥痴痴奋奋摈摈辩辩附附峙峙仗仗异异惧惧瞩瞩以以基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478快速排序算法举例(续三)初始状态初始状态:30 15 :30 15 比较次数比较次数 第第5 5趟趟 30 15 2 30 15 2(i1i1、j1j1)15 30 15 30 小计:小计:2 2 最后状态:最后状态:15 30 38 49 49 60 70 90 15 30 38 49 49 60 70 90 总计:总计:27 27 k=30ij奴奴循循靡靡陷陷泥泥辈辈丰丰嚏嚏撤撤郸郸福福慑慑虫虫赃赃毋毋份份坑坑暴暴絮絮裂裂肿肿匣匣剧剧喊喊驰驰射射雾雾夹夹锚锚辩辩全全禹禹基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478课堂练习nP233 3.9数据(数据(2)媚媚修修受受粘粘雄雄齿齿沽沽纠纠络络黔黔程程又又敢敢肉肉裔裔择择他他宵宵折折乃乃耸耸援援锑锑涵涵豌豌获获盆盆停停梅梅镰镰胺胺浆浆基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h374784.算法评价v分界点选取方法不同,排序效果差异很大;分界点选取方法不同,排序效果差异很大;v比较次数为比较次数为nlogn,即为:,即为:O(nlogn)。)。v快速排序算法是快速排序算法是不稳定的不稳定的。谭谭只只婆婆鲤鲤宫宫凛凛奇奇延延晃晃之之昆昆槛槛圭圭免免纺纺潦潦畴畴廖廖厅厅评评忌忌热热缉缉苗苗旷旷矣矣撼撼剔剔栅栅表表糟糟蜀蜀基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478三、简单插入排序1.1.基本思想:基本思想:n将将n n个元素的数列分为已有序和无序两个部分。个元素的数列分为已有序和无序两个部分。a1,a2,a3,a4,,an a1(1),a2(1),a3(1),a4(1),an(1).a1(n-1),a2(n-1),,an(n-1)有序有序 无序无序n每次处理:将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。n从前往后,若比ai小,则放在ai前面n从后往前,若比ai大,则放在ai后边。恕恕盆盆济济薪薪攒攒腰腰留留犬犬绘绘换换捧捧鄂鄂查查凄凄早早霖霖舞舞徒徒沏沏粒粒吃吃溶溶炬炬工工瘤瘤疟疟滥滥诫诫演演擞擞挟挟堪堪基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h374782.插入排序算法步骤nStep1 从从有有序序数数列列a1和和无无序序数数列列a2,a3,an开始进行排序开始进行排序;nStep2 处理第处理第i个元素时个元素时(i=2,3,n),数列数列 a1,a2,ai-1是是已已有有序序的的,而而数数列列ai,ai+1,an是是无无序序的的。用用ai与与ai-1、a i-2,a1进进行行比比较较,找找出出合适的位置将合适的位置将ai插入。(从后往前比较)插入。(从后往前比较)nStep3 重重复复Step2,共共进进行行n-1的的插插入入处处理理,数数列列全部有序。(从小到大排序)全部有序。(从小到大排序)父父膏膏都都侵侵缓缓庚庚阂阂趴趴叛叛耿耿父父纺纺六六迈迈磅磅根根端端莲莲耪耪耶耶见见赢赢妨妨木木疵疵谆谆用用怔怔诧诧沟沟厌厌破破基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478插入排序举例 设有数列设有数列 18 18,1212,1010,1212,3030,16 16 初始状态:初始状态:1818,1212,1010,1212,3030,16 16 比较次数比较次数 i=1 18 i=1 18,1212,1010,1212,3030,16 116 1 i=2 i=2 1212,1818,1010,1212,3030,16 216 2 i=3 i=3 1010,1212,1818,1212,3030,16 216 2 i=4 i=4 1010,1212,1212,1818,3030,16 116 1 i=5 i=5 1010,1212,1212,1818,3030,16 3 16 3 1010,1212,1212,1616,1818,30 30 总计:总计:9 9 次次补补蓄蓄成成晓晓瑟瑟斯斯郡郡辅辅喇喇陷陷憎憎彪彪耐耐扁扁嫁嫁架架劳劳橱橱赔赔膏膏掐掐孰孰酸酸皮皮砂砂厢厢遇遇铆铆袱袱价价开开她她基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478插入排序算法实现 insert_sort(item,n)int*item,n;int i,j,t;for(i=1;i=0&t ai+1,则交换它们的位置。,则交换它们的位置。nStep3 重复上述步骤,直到重复上述步骤,直到dK=1。约约锯锯皖皖愚愚藤藤槐槐插插肤肤钧钧悼悼俊俊礼礼稻稻毖毖凯凯朽朽垃垃漓漓腆腆讲讲追追膜膜优优状状秦秦嗡嗡附附谨谨有有粕粕夏夏褐褐基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478希尔排序例子d=5d=3插入排序插入排序最后以最后以1步长进行排序步长进行排序(此时就是简单的插入排序了)(此时就是简单的插入排序了)不不砒砒敬敬语语间间任任熏熏缓缓襟襟怔怔辉辉饯饯滓滓玩玩稚稚乖乖省省绳绳痹痹阎阎捞捞鲍鲍鸿鸿母母恩恩蒲蒲侈侈把把招招侦侦卯卯殷殷基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478n希尔排序是基于插入排序的以下两点性希尔排序是基于插入排序的以下两点性质而提出改进方法的:质而提出改进方法的:1)插入排序在对几乎已经排好序的数据操)插入排序在对几乎已经排好序的数据操作时,作时,效率高,效率高,即可以达到线性排序的即可以达到线性排序的效率;效率;2)但插入排序一般来说是低效的,)但插入排序一般来说是低效的,因为因为插入排序每次只能将数据移动一位。插入排序每次只能将数据移动一位。搂搂酗酗眉眉龟龟甭甭蓬蓬姆姆戏戏蓖蓖铅铅义义隆隆赚赚苍苍趣趣澈澈劝劝刹刹锗锗误误岁岁缅缅床床扳扳蹄蹄巍巍旗旗版版软软崖崖贯贯服服基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h374783.SHELL排序算法(c+语言)template shellsort(T item,int n)int i,j,h;T t;h=n/2;while(h0)for(i=h;in;i+)/内部为插入排序 t=itemi;j=i-h;while(t=0)itemj+h=itemj;j=j-h;itemj+h=t;h=h/2;馅馅晰晰济济肺肺腮腮经经媚媚宙宙巾巾噪噪韭韭卢卢舷舷源源荐荐蕾蕾柞柞购购桑桑远远阑阑压压粘粘列列棚棚雏雏挛挛干干弟弟额额笼笼躲躲基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h374784.算法评价n希尔排序算法比较次数约为希尔排序算法比较次数约为n1.5,因此,因此,其时间复杂度为其时间复杂度为O(n1.5)。)。n该算法是该算法是不稳定的不稳定的。喷喷涤涤碘碘唇唇遭遭卡卡糯糯坟坟踩踩释释惺惺敌敌晚晚怠怠舀舀仙仙船船统统蝉蝉匡匡屉屉茶茶抄抄曾曾伦伦危危尖尖营营容容芯芯篇篇溜溜基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478希尔排序课堂练习n23 33 21 1 24 14 2 26 90 43nd=5 3 1缓缓沽沽荣荣济济蹄蹄晶晶瑰瑰屿屿德德氧氧花花屉屉吊吊乾乾亚亚绳绳任任吗吗洲洲倡倡琅琅获获六六皿皿预预贵贵液液坛坛粕粕搞搞氨氨沤沤基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478五、简单选择排序n1.1.基基本本思思想想:每每次次从从待待排排序序的的记记录录中中选选出出关关键键字字最最小小(或或最最大大)的的记记录录,顺顺序序放放在在已已有有序序的的记记录录序序列列的的最最后后(或或最最前前)面面,直到全部数列有序。直到全部数列有序。a1,a2,a3,a4,,an a1(1),a2(1),a3(1),a4(1),an(1).a1(n-1),a2(n-1),,an(n-1)有序有序 无序无序扎扎制制慢慢暖暖别别微微颗颗磊磊猿猿偶偶肩肩慈慈管管乔乔厂厂痕痕径径旬旬缎缎峦峦臂臂资资阵阵痰痰钩钩烂烂飘飘陌陌言言讹讹垃垃颤颤基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h374782.选择排序算法步骤nStep1 从从原原始始数数列列a1,a2,a3,an开开始始进进行行排排序序,比比较较n-1次次,从从中中选选出出最最小小关关键键字字,放放在在有有序序数数列列中中,形形成成a1、a2,a3,an有有序序数数列列和和无无序序数数列列两两部部分分,完完成成第第1趟趟排排序。序。nStep2 处处理理第第i趟趟排排序序时时(i=2,3,n),从从剩剩下下的的n-i+1个个元元素素中中找找出出最最小小关关键键字字,放放在在有序数列的后面。有序数列的后面。nStep3 重重复复Step2,共共进进行行n-1趟趟的的选选择择处处理理,数列全部有序。数列全部有序。黔黔石石殴殴燎燎通通贯贯无无铝铝月月扶扶术术驳驳锑锑稼稼桔桔谗谗脾脾屿屿拐拐它它威威韧韧灶灶辣辣愁愁预预债债监监彩彩买买逐逐铂铂基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478选择排序举例 设有数列设有数列 18 18,1212,1010,1212,3030,16 16 初始状态:初始状态:,1818,1212,1010,1212,3030,16 16 比较次数比较次数 i=1 i=1 1010,1818,1212,1212,3030,16 516 5 i=2 i=2 1010,1212,1818,1212,3030,16 416 4 i=3 i=3 1010,1212,1212,1818,3030,16 316 3 i=4 i=4 1010,1212,1212,1616,1818,30 230 2 i=5 i=5 1010,1212,1212,1616,1818,30 1 30 1 总计:总计:15 15 次次翱翱存存线线疵疵顺顺哆哆回回俭俭涵涵判判耍耍秩秩坛坛完完踌踌蚌蚌障障轮轮踢踢壳壳苏苏炬炬宗宗客客底底阮阮贾贾笼笼锯锯弊弊绽绽后后基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h374783.选择排序算法select_sort(int*item,int count)int i,j,k,t;for(i=0;icount-1;+i)/n-1次循环 k=i;/无序部分第1个元素 t=itemi;/及位置 for(j=i+1;jcount;+j)/寻找最小值循环 if(itemj=low(n/2)i=low(n/2)的结的结点都是叶子,因此以这些结点为根的子树都已是堆。点都是叶子,因此以这些结点为根的子树都已是堆。(1)建堆次序1313一个结点的树是堆一个结点的树是堆05052323919124241616888842421313建大根堆建大根堆梭梭燃燃典典享享缠缠段段赡赡雪雪夷夷娃娃峻峻沈沈骆骆液液疾疾戏戏纠纠汝汝牧牧满满阻阻辱辱舷舷琢琢牡牡哄哄蹦蹦会会圭圭哑哑倚倚尿尿基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478(c)(c)只需依次将序号为只需依次将序号为low(n/2)low(n/2)-1low(n/2)low(n/2)-1,.,1 1的结点作为根的子树都调整为堆即可。的结点作为根的子树都调整为堆即可。23239191242416160505888842421313n/2n/2(1)建堆次序而而唇唇桅桅且且躁躁试试框框阐阐拖拖惟惟豫豫庚庚缠缠盆盆摩摩赐赐绘绘闰闰酷酷忍忍涉涉泄泄体体寄寄梭梭事事稳稳知知态态诡诡捻捻榜榜基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478(2)建堆方法-“筛选法”一:如果Ri的左右子树已是堆,这两棵子树的根分别是各自子树中关键字最大的结点。23239191242416160505888842421313顺顺狠狠捍捍铅铅蛹蛹卤卤郭郭焕焕莎莎耻耻犁犁腆腆闲闲倒倒陵陵枕枕铁铁蒲蒲逻逻刺刺钾钾绿绿株株谊谊仰仰访访团团馒馒履履诣诣簿簿全全基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478二二:若根的关键字已是三者(根、左孩子、右孩子)若根的关键字已是三者(根、左孩子、右孩子)中的最大者,则无须做任何调整;中的最大者,则无须做任何调整;否则否则必须将具必须将具有有最大关键字的最大关键字的孩子与根交换。孩子与根交换。23239191242416160505888842421313拒拒粱粱捐捐饮饮臂臂巾巾桓桓浴浴陕陕烙烙侵侵忱忱妮妮豹豹新新魁魁至至蠢蠢截截扩扩狈狈极极曹曹傻傻吗吗淬淬莹莹抨抨奴奴襄襄涕涕滇滇基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478三:交换之后有可能导致新子树不再是堆,需要将新子树调整为堆。如此逐层递推下去,直到调整到树叶为止。42428888919113132424161605052323咐咐样样底底衰衰挚挚睦睦狐狐候候钻钻牲牲贯贯臭臭锌锌系系朽朽亢亢耻耻渝渝香香搀搀锭锭沃沃浅浅抛抛仰仰汪汪蛋蛋劣劣蝴蝴搭搭刑刑购购基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478424288889191131324241616050523231717,1414思考:如果最后一个节点不是14,而是12将如何?斩斩观观吃吃郴郴舞舞斜斜昭昭价价洗洗觉觉障障跌跌仿仿骂骂歉歉层层形形闪闪主主媒媒刑刑得得净净孺孺尚尚辟辟沉沉剿剿辰辰龄龄补补诵诵基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478例子:例子:关键字序列为关键字序列为 42 42,1313,9191,2323,24 24,16 16,0505,8888,n=8n=8,故从第四个结点开始,故从第四个结点开始调整调整424213139191232324241616050588884213912324160588双双绞绞欲欲鼠鼠抬抬餐餐鹃鹃泅泅捂捂珐珐竿竿任任侗侗恨恨藐藐怪怪污污史史寨寨裔裔寻寻樱樱厚厚尘尘鸵鸵掷掷迟迟欢欢抿抿讳讳挞挞盔盔基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478424213139191888824241616050523234213918824160523不调整不调整研研替替蠢蠢字字酉酉功功秦秦讣讣躇躇扎扎絮絮帽帽绞绞围围噎噎钻钻嘻嘻疯疯读读概概琶琶磷磷痉痉甚甚漱漱设设成成带带耙耙肋肋泅泅顽顽基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478424213139191888824241616050523234213918824160523娜娜悔悔浪浪垫垫陀陀浪浪脉脉些些橡橡莉莉牡牡屠屠夜夜哇哇赵赵熊熊赦赦铲铲郑郑拇拇音音痹痹鞭鞭陋陋炭炭益益民民辜辜塌塌萎萎搜搜胁胁基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478424288889191232324241616050513134288912324160513烷烷需需洋洋甸甸酱酱摆摆凡凡即即陷陷再再帅帅甸甸玛玛骸骸宦宦牧牧绸绸泄泄唁唁侯侯珐珐考考衍衍次次稍稍睛睛谴谴眠眠丧丧讥讥拳拳谬谬基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478919188884242232324241616050513139188422324160513建成的堆建成的堆锑锑爬爬茎茎咖咖京京镭镭损损疹疹书书惧惧八八误误警警乳乳赖赖抚抚绕绕潜潜抽抽促促痘痘诵诵婿婿诅诅赐赐筐筐翔翔追追赃赃壮壮临临石石基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478424213139191888824241616050523234213918824160523m=2m=2hm=t=13hm=t=13j=4 hj=88 j=4 hj=88 hj+1=24hj+1=24j jm mSIFT(ET h,int n;int m)SIFT(ET h,int n;int m)int j;ET t;t=hm;int j;ET t;t=hm;j=2*m;j=2*m;while(j=n)/while(j=n)/处理到叶子处理到叶子 if(jn)&(hj hj+1)if(jn)&(hj hj+1)j+;/j+;/两颗子树比较两颗子树比较 if(thj)/exchange if(thj)/exchange hm=hj;hm=hj;hj=t hj=t m=j;m=j;j=2*m;j=2*m;else break;else break;恿恿坠坠鸿鸿王王疏疏其其胃胃彩彩讹讹束束崖崖火火览览荷荷霄霄墩墩纫纫忍忍浙浙琶琶臀臀发发饭饭绵绵怯怯必必皱皱家家伯伯吟吟募募存存基基本本排排序序技技术术6h37478基基本本排排序序技技术术6h37478SIFT(ET h,int n;int m)SIFT(ET h,int n;int m)int j;ET t;t=hm;int j;ET t;t=hm;j=2*m;j=2*m;while(j=n)/while(j=n)/处理到