数据结构.第10章.排序.1.插入排序和交换排序.pptx
《数据结构.第10章.排序.1.插入排序和交换排序.pptx》由会员分享,可在线阅读,更多相关《数据结构.第10章.排序.1.插入排序和交换排序.pptx(63页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、武汉科技大学Wuhan University of Science and Technology张 凯计算机学院 软件工程系2011年3月12日第第1010章章 内部排序内部排序选择排序(直接排序、堆排序)概述插入排序(直接排序、折半排序、希尔排序)交换排序(冒泡排序、快速排序)归并排序基数排序v概述概述10.1概述概述排序:将数据元素的一个任意序列,重新排列成一个按关键字有序的序列。例:将关键字序列:52,49,80,36,14,58,61,23调整为:14,23,36,49,52,58,61,80若按主关键字排序则结果惟一若按次关键字排序则结果可以不惟一(因有相同关键字)v概述概述10.1
2、概述概述设Ki、Kj(1in,1jn,ij)分别为记录Ri、Rj 的关键字,且Ki=Kj,在排序前的序列中Ri领先于Rj(即i j)。若在排序后的序列中Ri仍领先于Rj,则称所用的排序方法是稳定的;反之,则称所用的排序方法是不稳定的。例:设排序前的关键字序列为:52,49,80,36,14,58,36,23若排序后的关键字序列为:14,23,36,36,49,52,58,80,则排序方法是稳定的。若排序后的关键字序列为:14,23,36,36,49,52,58,80,则排序方法是不稳定的。v概述概述10.1概述概述内部排序和外部排序若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排
3、序;反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。v插入排序插入排序10.2插入排序插入排序直接插入排序初始状态4938659776132749 R0R1R2R3R4R5R6R7R8i=2i=33849659776132749i=43849659776132749i=5384965769713274976i=6384965769713274913i=7384965769713274927i=83849657697132749494938659776132749 3849387趟排序1趟排序2趟排序排序过程排序过程:先将序列中第1个记录看成是一
4、个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序。v直接插入排序直接插入排序10.2插入排序插入排序voidInsertSort(SqList&L)/对顺序表L作直接插入排序。for(i=2;i=L.length;+i)if(L.ri.keyL.ri-1.key)/InsertSort在r1.i-1中查找ri的插入位置;对于在查找过程中找到的那些关键字不小于ri.key的记录,在查找的同时实现记录向后移动;插入ri;L.r0=L.ri;/复制为监视哨L.ri=L.ri-1;for(j=i-2;L.r0.keyL.rj.key;-j)L.rj+1=L.rj;/记录后移L.rj+
5、1=L.r0;/插入到正确位置v直接插入排序性能分析直接插入排序性能分析10.2插入排序插入排序比较次数:移动次数:0最好的情况:待排序记录按关键字从小到大排列(正序)比较次数:移动次数:最坏的情况:待排序记录按关键字从大到小排列(逆序)v直接插入排序性能分析直接插入排序性能分析10.2插入排序插入排序由于待排记录序列是随机的,取上述二值的平均值。所以直接插入排序的时间复杂度为O(n2)。直接插入排序是“稳定的”:关键码相同的两个记录,在整个排序过程中,不会通过比较而相互交换。v折半折半插入排序插入排序10.2插入排序插入排序(1)基本思想考虑到L.r1,.,i-1是按关键字有序的有序序列,则
6、可以利用折半查找实现“L.r1,i-1中查找L.ri的插入位置”如此实现的插入排序为折半插入排序。例:有例:有6个记录,前个记录,前5个已排序的基础上,对第个已排序的基础上,对第6个记录排序。个记录排序。15273653694215273653694215273653694215273642536910.2插入排序插入排序(high36)(4253)highmidlowlowhighmidhighlow折半插入排序在寻找插入位置时,不是逐个比较而是利用折半查找的原理寻找插入位置。待排序元素越多,改进效果越明显。v折半插入排序折半插入排序算法算法10.2插入排序插入排序voidBinsertSo
7、rt(SqList&L)/折半插入排序inti,low,high,mid;for(i=2;i=L.length;+i)L.r0=L.ri;/将L.ri暂存到L.r0low=1;high=i-1;While(low=high)/比较,折半查找插入位置mid=(low+high)/2;/折半if(L.r0.key=low;j)L.rj+1=L.rj;/记录后移L.rlow=L.r0;/插入/BInsertSortv折半插入排序折半插入排序算法分析算法分析10.2插入排序插入排序折半查找比顺序查找快,所以折半插入排序就平均性能来说比直接插入排序要快。折半插入排序减少了关键字的比较次数,但记录的移动次
8、数不变,其时间复杂度与直接插入排序相同。在插入第i 个对象时,需要经过log2i+1次关键码比较,才能确定它应插入的位置。折半插入排序是一个稳定的排序方法。v2-路插入排序路插入排序10.2插入排序插入排序(1)基本思想2-路插入排序是在折半插入排序的基础上改进的,目的是减少排序过程中移动记录的次数,但为此需要n个记录的辅助空间。v2-路插入排序路插入排序10.2插入排序插入排序(2)具体做法另设一个和L.r同类型的数组d,首先将L.r1赋值给d1,并将d1看成是在排好序的序列中处于中间位置的记录,然后从L.r中第2个记录起依次插入到d1之前或之后的有序序列中。先将待插入记录的关键字和d1的关
9、键字进行比较。若L.rid1.key,则将L.ri插入到d1之前的有序表中。反之,插入到d1之后的有序表中。【初始关键字】4938659776132749排序过程中d的状态如下:i=1:(49)i=2:(49)(38)i=3:(4965)(38)i=4:(496597)(38)i=5:(49657697)(38)i=6:(49657697)(1338)i=7:(49657697)(132738)i=8:(4949657697)(132738)finalfirst2路插入排序过程示例:firstfinalfinalfirstfinalfirstfinalfirstfinalfirstfinalf
10、irstfinalfirstvoidPath2Insertion(SqList&L,SqList&d)d0=L1;/L中D的第一个记录为d中排好序的记录。intfirst=0,final=0;/first、final分别指示d中排好序的记录的第1个和最后1个记录的位置for(inti=2;i=length;+i)/依次将L的第2个最后一个记录插入d中。if(Lidfinal)/待插入记录大于d中最小值,插入到dfinal之后final=final+1;dfinal=Li;else/待插入记录大于d中最小值,小于d中最大值,插入到d的中间(需要移动d数组)intj=final+;/移动d尾部元素
11、以便按序插入记录。while(Lidj)d(j+1)%length=dj;j=(j-1+length)%length;dj+1=Li;for(inti=1;i=length;i+)/循环把d赋给L。Li=d(i+first-1)%length;/线性关系。v2-路插入排序路插入排序10.2插入排序插入排序2-路插入排序只能减少移动记录的次数,而不能绝对避免移动记录。2-路插入排序中,移动记录的次数约为n2/8。当L.r1是待排序记录中关键字最小或最大的记录时,2-路插入排序就完全失去了它的优越性。v表表插入排序插入排序10.2插入排序插入排序(1)基本思想通过改变排序过程中采用的存储结构,减少
12、在排序过程中进行“移动”记录的操作。利用静态链表进行排序,并在排序完成之后,一次性地调整各个记录相互之间的位置,即将每个记录都调整到它们所应该在的位置上。v表表插入排序插入排序10.2插入排序插入排序#defineMAXSIZE100/静态链表容量TypedefstructRcdTyperc;/记录项intnext;/指针项SLNode;/表结点类型TypedefstructSLNoderMAXSIZE+1;/0号单元为表头结点intlength;/链表当前长度SLinkListType;/静态链表类型(2)待排记录序列的存储结构v表表插入排序插入排序10.2插入排序插入排序(3)具体做法首先
13、将静态链表中数组下标为“1”的分量(结点)和表头结点构成一个循环链表,然后依次将下标为“2”至“n”的分量(结点)按记录关键字非递减有序插入到循环链表中。10.2插入排序插入排序voidTableSort(int*a,intn)nexthead=0=-1;for(i=1;in;i+)if(ai=ahead)nexti=head;head=i;elsep=head;while(nextp!=-1&anextpai)p=nextp;nexti=nextp;nextp=i;初始状态012345678MAXINT493865977613274910-i=3012345678MAXINT49386597
14、76132749201-key域next域i=2012345678MAXINT493865977613274910-38123650i=4012345678MAXINT49386597761327492310-9740i=5012345678MAXINT493865977613274923140-i=6012345678MAXINT4938659776132749231504-i=7012345678MAXINT49386597761327496315042-i=8012345678MAXINT493865977613274963150472-7645136227724938v表表插入排序插入
15、排序10.2插入排序插入排序(4)表插入排序性能分析从表插入排序的过程可见,表插入排序的基本操作仍是将一个记录插入到已排好序的有序表当中。和直接插排序相比,不同之处仅是以修改2n次指针值代替移动记录,排序过程中所需进行的关键字间的比较次数相同。因此表插入排序的时间复杂度仍是O(n2)。v表表插入排序插入排序10.2插入排序插入排序(4)表插入排序性能分析表插入排序的结果只是求得一个有序链表,则只能对它进行顺序查找,不能进行随机查找,为了能实现有序表的折半查找,尚需对记录进行重新排列。10.2插入排序插入排序1.我们都能理解,优秀排序算法的首要条件就是2.于是人们想了许许多多的排序办法,目的就是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 10 排序 插入 交换
限制150内