中国计量学院数据结构第10章-排序辩析优秀PPT.ppt
《中国计量学院数据结构第10章-排序辩析优秀PPT.ppt》由会员分享,可在线阅读,更多相关《中国计量学院数据结构第10章-排序辩析优秀PPT.ppt(77页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第十章 内部排序10.1 概述概述10.2 插入排序插入排序10.3 快速排序快速排序10.4 选择排序选择排序10.5 归并排序归并排序10.6 基数排序基数排序10.7 各种排序方法的综合比较各种排序方法的综合比较10.1 概概 述述一、何为排序一、何为排序二、内部排序和外部排序二、内部排序和外部排序三、内部排序方法的分类三、内部排序方法的分类一、何为排序?一、何为排序?将一组“无序无序”的记录序列调整为“有序有序”的记录序列。例如:将如下序列52,49,80,36,14,58,61,23,97,75调整为14,23,36,49,52,58,61,75,80,97二、内部排序和外部排序二、
2、内部排序和外部排序 整个排序过程不须要访问外存便能完成,则为内部排序;反之,若参与排序的记录很多,整个排序过程不行能在内存中完成,称为外部排序。三、内部排序的方法三、内部排序的方法内部排序内部排序的过程实质是一个逐步逐步扩大有序序列长度扩大有序序列长度的过程。经过一趟排序经过一趟排序有序序列区无 序 序 列 区有序序列区无 序 序 列 区基于不同的“扩大扩大”有序序列长度的方法,方法,内部排序内部排序大致可分下列几种类型:插入类插入类交换类交换类选择类选择类归并类归并类其它方法其它方法1.插入类插入类将无序子序列中的一个(或几个)“插入插入”到有序序列中,从而增加有序子序列的长度。2.交换类交
3、换类通过“交换交换”无序序列中的记录以得到其中最小或最大记录,将它加入到有序子序列中,从而增加有序子序列的长度。3.选择类选择类从记录的无序子序列中“选择”最小或最大的记录,将它加入到有序子序列中,从而增加有序子序列的长度。4.归并类归并类 通过“归并归并”两个或两个以上的记录有序子序列,逐步增加有序序列的长度。5.其它方法其它方法 10.2 插插 入入 排排 序序有序序列R1.i-1Ri无序序列 Ri.n插入排序的基本思想有序序列R1.i无序序列 Ri+1.n(一趟)(一趟)插入排序插入排序分三步走:分三步走:3将Ri 插入插入到Rj+1的位置上。2将将Rj+1.i-1中的全部记录均后移一个
4、中的全部记录均后移一个位置;位置;1在R1.i-1中查找查找Ri的插入位置,即 R1.j.key Ri.key Rj+1.i-1.key;干脆插入排序(基于依次查找)干脆插入排序(基于依次查找)不同的实现方法导致不同的算法不同的实现方法导致不同的算法折半插入排序折半插入排序(基于折半查找)(基于折半查找)希尔排序希尔排序(基于逐趟缩小增量)(基于逐趟缩小增量)一、干脆插入排序一、干脆插入排序利用“依次查找”实现在R1.i-1中查找Ri的插入位置。void InsertionSort(SqList&L)/对依次表对依次表 L 作干脆插入排序。作干脆插入排序。for(i=2;i=L.length;
5、+i)if(L.ri.key L.ri-1.key)/InsertionSortL.r0=L.ri;/设置监视哨for(j=i-1;L.r0.key L.rj.key;-j)L.rj+1=L.rj;/记录后移L.rj+1=L.r0;/插入到正确位置 因为 R1.i-1 是一个有序序列,因此可以利用折半查找折半查找在R1.i-1中找出Ri的插入位置。称这种排序为折半插入排序折半插入排序。二、折半插入排序二、折半插入排序void BiInsertionSort(SqList&L)/BiInsertionSort在在 L.r1.i-1中折半查找插入位置;中折半查找插入位置;for(i=2;i=hig
6、h+1;-j)L.rj+1=L.rj;/记录后移L.rhigh+1=L.r0;/插入low=1;high=i-1;while(low=high)m=(low+high)/2;/折半if(L.r0.key L.rm.key)high=m-1;/插入点在低半区else low=m+1;/插入点在高半区三、希尔排序三、希尔排序(又称缩小增量排序又称缩小增量排序)也是一种插入排序方法,但时间困难度也是一种插入排序方法,但时间困难度有较大改进有较大改进基本思想基本思想对无序序列先作对无序序列先作“宏观宏观”调整,后作调整,后作“微观微观”调整调整所谓所谓“宏观宏观”调整,指的是,调整,指的是,“跳动式跳
7、动式”的插入排序的插入排序将序列分成若干子序列,对每个子序列进行插入排序。其中,d 称为增量,它的值在排序过程中渐渐缩小,直至为 1 例如:将 n 个记录分成 d 个子序列:R1,R1+d,R1+2d,R1+kd R2,R2+d,R2+2d,R2+kd Rd,R2d,R3d,Rkd,R(k+1)d 增量为增量为5 5原始序列原始序列8181949411119696121235351717959528285858414175751515子序列子序列1 18181 3535 4141 子序列子序列2 29494 1717 7575 子序列子序列3 31111 9595 1515子序列子序列4 49
8、696 2828 子序列子序列5 51212 5858 结果结果子序列子序列1 13535 4141 8181 子序列子序列2 21717 7575 9494 子序列子序列3 31111 1515 9595子序列子序列4 42828 9696 子序列子序列5 51212 5858 原始序列原始序列3535171711112828121241417575151596965858818194949595增量为增量为3 3原始序列原始序列35171128124175159658819495子序列子序列1 135 28 75 58 95子序列子序列2 217 12 15 81 子序列子序列3 311
9、41 96 94 结果结果子序列子序列1 128 35 58 75 95子序列子序列2 212 15 17 81 子序列子序列3 311 41 94 96 原始序列原始序列28121135154158179475819695增量为增量为1 1原始序列原始序列28121135154158179475819695子序列子序列1 111121517283441587581949596void ShellInsert(SqList&L,int d)for(i=d+1;i=n;+i)if(L.ri.key0&(L.r0.keyL.rj.key);j-=d)L.rj+d=L.rj;/记录后移,查找插入位置
10、 L.rj+d=L.r0;/插入 /if/ShellInsertvoid ShellSort(SqList&L,int delta,int t)/增量为delta的希尔排序 for(k=0;kt;+t)ShellInsert(L,deltak);/一趟增量为deltak的插入排序/ShellSort 首先对无序序列进行“划分划分”,之后将两个子序列“递归递归”进行快速排序进行快速排序。无 序 的 记 录 序 列无序子序列 1无序子序列 2枢轴枢轴划分分别进行快速排序10.3 快快 速速 排排 序序int partition(int a,int left,int right)/划分划分 int
11、low=left;int high=right;int key=alow;/第一个记录作为枢轴第一个记录作为枢轴 while(low high)while(low=key)high-;alow=ahigh;/将比枢轴小的移到低端将比枢轴小的移到低端 while(low high&alow=right)return;s=partition(a,left,right);Qsort(a,left,s-1);/排序前半部分排序前半部分 Qsort(a,s+1,right);/排序后半部分排序后半部分10.4 选选 择择 排排 序序简 单 选 择 排 序堆 排 序树 形 选 择 排 序一、简洁选择排序一
12、、简洁选择排序有序序列R1.i-1无序序列 Ri.n 第第 i 趟趟从中选出最小的记录有序序列R1.i无序序列 Ri+1.nvoid SelectSort(Elem R,int n)/对记录序列对记录序列R1.n作简洁选择排序。作简洁选择排序。for(i=1;in;+i)/SelectSortj=SelectMinKey(R,i);/在 Ri.n 中选择最小的记录if(i!=j)RiRj;/交换交换二、树形选择排序二、树形选择排序依据锦标赛思想进行的选择排序。三、堆排序三、堆排序堆满足下列性质的序列r1,r2,,rn:或或12,36,27,65,40,34,98,81,73,55,49例如例如
13、:是是小顶堆小顶堆12,36,27,65,40,14,98,81,73,55,49不是堆不是堆(小顶堆小顶堆)(大顶堆大顶堆)rir2i r2i+1 若将该序列视作完全二叉树,则 r2i 是 ri 的左孩子,r2i+1 是 ri 的右孩子。1236276549817355403498例如例如:是堆是堆14不不堆排序堆排序小顶(根)堆堆顶是最小值,输出并从堆上删除,调整剩余的n-1个数据元素序列,使之再次成为小顶堆,即可得到次小值如此反复执行,便能得到一个有序序列大顶(根)堆堆排序的步骤建立堆删除根(具有最小/大值)根和最终一个元素交换(不再是堆)筛选:调整完全二叉树,使之成为堆所谓“筛选筛选”
14、指的是,对一棵左/右子树均为堆的完全二叉树,“调整调整”根结点根结点使整个二叉树也成为一个堆。堆堆筛筛选选98814973556412362740例如例如:是大顶堆是大顶堆12但在 98 和 12 进行互换之后,它就不不是堆了,因此,须要对它进行“筛选”。98128173641298比较交换建堆是一个从下往上进行建堆是一个从下往上进行“筛选筛选”的过程。的过程。40554973816436122798例如例如:排序之前的关键字序列为123681734998817355 现在,左/右子树都已经调整为堆,最终只要调整根结点,使整个二叉树是个“堆”即可。98494064361227堆排序即是利用堆排
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中国 计量 学院 数据结构 10 排序 优秀 PPT
限制150内