DataStructure第十章排序10.1概述10.2插入排序10.2.1直接插入排序10.2.2其他插入排序10.3快速排序10.4选择排序10.4.1简单选择排序10.4.2树形选择排序DataStructure10.1概述将一组杂乱无章的数据按一定的规律顺次排列起来。存放在数据表中按关键字排序定义:设有记录序列:{R1、R2……….Rn}其相应的关键字序列为:{K1、K2…….Kn};若存在一种确定的关系:Kx<=Ky<=…<=Kz,则将记录序列{R1、R2……….Rn}排成按该关键字有序的序列:{Rx、Ry………Rz}的操作,称之为排序。1.什么是排序?例如:将下列关键字序列52,49,80,36,14,58,61,23,97,75调整为14,23,36,49,52,58,61,75,80,97DataStructure2.排序的目的是什么?3.排序算法的好坏如何衡量?便于查找!时间效率——排序速度(即排序所花费的全部比较次数)空间效率——占内存辅助空间的大小稳定性——若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。DataStructure4.什么叫内部排序?什么叫外部排序?大多数排序算法都有两个基本的操作:(1)比较两个关键字的大小(2)将记录从一个位置移动到另一个位置记录序列的存储方式:(1)顺序存储(2)静态链表(3)地址注:外部排序时,要将数据分批调入内存来排序,中间结果还要及时放入外存,显然外部排序要复杂得多。若待排序记录都在内存中,称为内部排序;若待排序记录一部分在内存,一部分在外存,则称为外部排序。DataStructure5.内部排序的算法有哪些?按排序的规则不同,可分为5类:•插入排序•交换排序(重点是快速排序)•选择排序•归并排序•基数排序多关键字排序按排序算法的时间复杂度不同,可分为3类:•简单的排序算法:时间效率低,O(n2)•先进的排序算法:时间效率高,O(nlog2n)•基数排序算算法:时间效率高,O(d×n)DataStructure注:大多数排序算法都是针对顺序表结构的(便于直接移动元素)6.顺序存储(顺序表)的抽象数据类型如何表示?Typedefstruct{//定义每个记录(数据元素)的结构KeyTypekey;//关键字InfoTypeotherinfo;//其它数据项}RedType;Typedefstruct{//定义顺序表的结构RedTyper[MAXSIZE+1];//存储顺序表的向量//r[0]一般作哨兵或缓冲区intlength;//顺序表的长度}SqList;#defineMAXSIZE20//设记录不超过20个typedefintKeyType;//设关键字为整型量(int型)DataStructure10.2插入排序插入排序有多种具体实现算法:1)直接插入排序2)折半插入排序插入排序的基本思想是:将待排序表看做是左、右两部分,其中左边为有序区,右边为无序区,整个排序过程就是将右边无序区中的记录依次按关键字大小逐个插入到左边有序区中,以构成新的有序区直到全部记录都排好序。有序序列R[1..i-1]R[i]无序序列R[i..n]有序序列R[1..i]无序序列R[i+1..n]DataStructure1)1)直接插入排序直接插入排序新元素插入到哪里?例1:关键字序列T=(13,6,3,31,9,27,5,11),请写出直接插入排序的中间过程序列。【13】,6,3,31,9,27,5,11【6,13】,3,31,9,27,5,11【3,6,13】,31,9,27,5,11【3,6,13,31】,9,27,5,11【3,6,9,13,31】,27,5,11【3,6,9,13,27,31】,5,11【3,5,6,9,13,27,31】,11【3,5,6,9,11,13,27,31】最简单的排序法!最简单的排序法!在已形成的有序表中线性查找,并在适当位置插入,把原来位置上的元素向后顺移。DataStructure例例22::关键字序列关键字序列T=T=((2121,,2525,,4949,,25*25*,,1616,,0808),),请写出直接插入排序的具体实现过程。请写出直接插入排序的具体实现过程。*表示后一个25ii=1=121212525494925*25*161608080123456暂暂存存2121ii=2=2ii=3=3ii=5=5ii=4=4ii=6=625252525252549494949494925*25*25*25*49491616161625*25*080808084949解:序列存入一维数组V[7]中,将V[0]作为缓冲或暂存单元21212525494925*25*2121初态:1616494925*25*2525212116160808完完成成!!则程序执行过程为:DataStructure算法10.1voidInsertSort(SqList&L){//对顺序表L作直接插入排序。L.r[j+1]=L.r[0]//插入到正确位置}}//Insertsortfor(i=2;i<=L.1ength;++i)ifLT(L.r[i].key,L.r[i-1].key){//“<”,需...