数据结构与算法内部排序分析学习教案.pptx
《数据结构与算法内部排序分析学习教案.pptx》由会员分享,可在线阅读,更多相关《数据结构与算法内部排序分析学习教案.pptx(70页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、会计学1数据结构数据结构(sh j ji u)与算法内部排序与算法内部排序分析分析第一页,共70页。10101 1概述概述(i sh)(i sh)一、排序的定义一、排序的定义一、排序的定义一、排序的定义 假设有假设有假设有假设有n n个记录的序列为:个记录的序列为:个记录的序列为:个记录的序列为:R1R1,R2R2,,Rn,Rn 其对应的关键字为其对应的关键字为其对应的关键字为其对应的关键字为K1K1,K2K2,,Kn,Kn 需要确定需要确定需要确定需要确定1 1,2 2,,n,n的一种排列的一种排列的一种排列的一种排列P1P1,P2P2,,Pn,Pn 使:使:使:使:Kp1Kp1K p2K
2、p2K p nK p n 则则则则R p1R p1,R p2R p2,,R pn,R pn为一个为一个为一个为一个(y)(y)按关键字有序的序按关键字有序的序按关键字有序的序按关键字有序的序列。其中,列。其中,列。其中,列。其中,KiKi可以是记录可以是记录可以是记录可以是记录RiRi的主关键字、次关键字或若干数据项的主关键字、次关键字或若干数据项的主关键字、次关键字或若干数据项的主关键字、次关键字或若干数据项的组合。的组合。的组合。的组合。第1页/共70页第二页,共70页。二、排序方法的稳定二、排序方法的稳定二、排序方法的稳定二、排序方法的稳定(wndng)(wndng)(wndng)(wn
3、dng)性性性性 若若若若Ki=Kj,(1Ki=Kj,(1Ki=Kj,(1Ki=Kj,(1 i i i i j j j j n),n),n),n),且排序前,且排序前,且排序前,且排序前,RiRiRiRi在在在在RjRjRjRj前面,前面,前面,前面,若排序后,若排序后,若排序后,若排序后,RiRiRiRi仍在仍在仍在仍在RjRjRjRj前面前面前面前面 则则则则 称称称称 该该该该 排排排排 序序序序 算算算算 法法法法 是是是是 稳稳稳稳 定定定定(wndng)(wndng)(wndng)(wndng)的的的的,否否否否 则则则则 是是是是 不不不不 稳稳稳稳 定定定定(wndng)(wn
4、dng)(wndng)(wndng)的。的。的。的。三、排序分类三、排序分类三、排序分类三、排序分类根据根据根据根据(gnj)(gnj)(gnj)(gnj)待排序的记录的数量划分:待排序的记录的数量划分:待排序的记录的数量划分:待排序的记录的数量划分:内部排序:内部排序:内部排序:内部排序:待排序的记录存放在计算机的内存中的排序过程待排序的记录存放在计算机的内存中的排序过程待排序的记录存放在计算机的内存中的排序过程待排序的记录存放在计算机的内存中的排序过程外部排序:外部排序:外部排序:外部排序:待待待待排排排排序序序序的的的的记记记记录录录录数数数数量量量量很很很很大大大大,内内内内存存存存一
5、一一一次次次次放放放放不不不不下下下下全全全全部部部部记记记记录录录录,在在在在排排排排序序序序过程中还需访问外存的排序过程。过程中还需访问外存的排序过程。过程中还需访问外存的排序过程。过程中还需访问外存的排序过程。第2页/共70页第三页,共70页。四四四四、内内内内部部部部排排排排序序序序(pi(pi(pi(pi x)x)x)x)方法方法方法方法 插入排序插入排序插入排序插入排序(pi x)(pi x)(pi x)(pi x)交换排序交换排序交换排序交换排序(pi x)(pi x)(pi x)(pi x)选择排序选择排序选择排序选择排序(pi x)(pi x)(pi x)(pi x)归并排序
6、归并排序归并排序归并排序(pi x)(pi x)(pi x)(pi x)基数排序基数排序基数排序基数排序(pi x)(pi x)(pi x)(pi x)五、待排序记录的存储五、待排序记录的存储五、待排序记录的存储五、待排序记录的存储(cn ch)(cn ch)(cn ch)(cn ch)方式方式方式方式 存放在地址连续的一组存储存放在地址连续的一组存储存放在地址连续的一组存储存放在地址连续的一组存储(cn ch)(cn ch)(cn ch)(cn ch)单元单元单元单元-约定约定约定约定 存放在静态链表存放在静态链表存放在静态链表存放在静态链表 存放在地址连续的一组存储存放在地址连续的一组存储
7、存放在地址连续的一组存储存放在地址连续的一组存储(cn ch)(cn ch)(cn ch)(cn ch)单元,另设一组索引指针单元,另设一组索引指针单元,另设一组索引指针单元,另设一组索引指针第3页/共70页第四页,共70页。#define MAXSIZE 20#define MAXSIZE 20 /一一一一个个个个用用用用作作作作示示示示例例例例的的的的小小小小顺顺顺顺序序序序表表表表的的的的最最最最大长度大长度大长度大长度(chngd)(chngd)typedef int KeyType;/typedef int KeyType;/定义关键字类型为整数类型定义关键字类型为整数类型定义关键字
8、类型为整数类型定义关键字类型为整数类型typedef structtypedef struct KeyType key;KeyType key;/关键字关键字关键字关键字 InfoType otherinfo;InfoType otherinfo;/其它数据项其它数据项其它数据项其它数据项RedType;RedType;/记录类型记录类型记录类型记录类型typedef structtypedef struct RedType rMAXSIZE;RedType rMAXSIZE;/r0 /r0赋闲或用作哨兵单元赋闲或用作哨兵单元赋闲或用作哨兵单元赋闲或用作哨兵单元 int length;int
9、length;/顺序表长度顺序表长度顺序表长度顺序表长度(chngd)(chngd)SqList;SqList;第4页/共70页第五页,共70页。10102 2插入排序插入排序insert sortinginsert sorting一、直接插入排序一、直接插入排序一、直接插入排序一、直接插入排序 方法:将一个方法:将一个方法:将一个方法:将一个(y)(y)(y)(y)记录插入已排好序的有序表中,得到记录插入已排好序的有序表中,得到记录插入已排好序的有序表中,得到记录插入已排好序的有序表中,得到一个一个一个一个(y)(y)(y)(y)新的记录数增加新的记录数增加新的记录数增加新的记录数增加1 1
10、 1 1的有序表的有序表的有序表的有序表(1 1 1 1)把序列)把序列)把序列)把序列(R(K1)(R(K1)(R(K1)(R(K1)看成是一个看成是一个看成是一个看成是一个(y)(y)(y)(y)有序的子序列有序的子序列有序的子序列有序的子序列 把把把把R(K2)R(K2)R(K2)R(K2)插入到该序列中插入到该序列中插入到该序列中插入到该序列中,使插入后序列使插入后序列使插入后序列使插入后序列 (R(K1),R(K2)(R(K1),R(K2)(R(K1),R(K2)(R(K1),R(K2)有序有序有序有序(2 2 2 2)把)把)把)把R(K3)R(K3)R(K3)R(K3)插入到插入
11、到插入到插入到(R(K1),R(K2)(R(K1),R(K2)(R(K1),R(K2)(R(K1),R(K2)中,中,中,中,使插入后有序使插入后有序使插入后有序使插入后有序(3 3 3 3)重复()重复()重复()重复(2 2 2 2),直到插入),直到插入),直到插入),直到插入R(Kn)R(Kn)R(Kn)R(Kn)为止。为止。为止。为止。第5页/共70页第六页,共70页。7目录页张铭、邹艳珍、刘楚雄、闫宏飞、郝丹数据结构与算法插入排序动画 1234322964453478第6页/共70页第七页,共70页。45,34,78,12,34,32,29,64 45 45 34 45 34 45
12、 34 45 78 34 45 78 12 34 45 78 12 34 45 78 12 34 12 34 3434 45 78 45 78 12 32 34 12 32 34 3434 45 78 45 78 12 29 32 34 12 29 32 34 3434 45 78 45 78 12 29 32 34 34 45 64 78 12 29 32 34 34 45 64 78第7页/共70页第八页,共70页。void InsertSort(SqList&L)void InsertSort(SqList&L)/对顺序表对顺序表对顺序表对顺序表L L做直接插入做直接插入做直接插入做直接
13、插入(ch r)(ch r)排序排序排序排序 for(i=2;i=L.length;+i)for(i=2;i=L.length;+i)if(LT(L.ri.key,L.ri-1.key)if(LT(L.ri.key,L.ri-1.key)/将将将将L.riL.ri插插插插入入入入(ch(ch r)r)有有有有序序序序子子子子表表表表 L.r0=L.ri;L.r0=L.ri;for(j=i-1;LT(L.r0.key,L.rj.key);-j)for(j=i-1;LT(L.r0.key,L.rj.key);-j)L.rj+1=L.rj;L.rj+1=L.rj;/记录后移记录后移记录后移记录后移
14、L.rj+1=L.r0;L.rj+1=L.r0;/插入插入插入插入(ch r)(ch r)到正确位置到正确位置到正确位置到正确位置 /InsertSort/InsertSort第8页/共70页第九页,共70页。算法算法(sun f)分析分析稳定空间代价:O(n)时间(shjin)代价:最佳情况:n-1次比较,O(n)最差情况:O(n2)比较次数为平均情况:O(n2)第9页/共70页第十页,共70页。例:在序列例:在序列例:在序列例:在序列(xli)13(xli)13(xli)13(xli)13,27272727,35353535,48484848,65656565,72727272中插入中插入
15、中插入中插入20202020或或或或606060603565132748722060二、折半插入排序二、折半插入排序二、折半插入排序二、折半插入排序Binary Insertsort Binary Insertsort Binary Insertsort Binary Insertsort 用折半查找的方法用折半查找的方法用折半查找的方法用折半查找的方法(fngf)(fngf)(fngf)(fngf)找到插入位置找到插入位置找到插入位置找到插入位置第10页/共70页第十一页,共70页。void BInsertSort(SqList&L)void BInsertSort(SqList&L)/对顺
16、序表对顺序表对顺序表对顺序表L L做折半做折半做折半做折半(zhbn)(zhbn)插入排序插入排序插入排序插入排序 for(i=2;i=L.length;+i)for(i=2;i=L.length;+i)L.r0=L.ri;L.r0=L.ri;/将将将将L.riL.ri暂存到暂存到暂存到暂存到L.r0L.r0 low=1;hight=i-1;low=1;hight=i-1;while(low=hight)while(low=hight+1;-j)L.rj+1=L.rj;/for(j=i-1;j=hight+1;-j)L.rj+1=L.rj;/记录后移记录后移记录后移记录后移 L.rhight+
17、1=L.r0;L.rhight+1=L.r0;/插入到正确位置插入到正确位置插入到正确位置插入到正确位置 /BInsertSort/BInsertSort第11页/共70页第十二页,共70页。四四、希希尔尔排排序序(pi(pi x)x)(缩缩小小增增量量排排序序(pi x)Shell Sort(pi x)Shell Sort)思想:先将序列转化为若干小序列,在这些小序列内进行插入排序逐渐增加小序列的规模,而减少小序列个数,使得待排序序列逐渐处于(chy)更有序的状态最后对整个序列进行一趟直接插入排序直接插入排序的两个特点:在最好情况下时间代价为O(n)对于(duy)短序列,直接插入排序比较有效
18、第14页/共70页第十五页,共70页。按增量序列将整个待排记录分割成若干个序列,分别进行直接插入排序。等整个序列基本有序后,再对全体记录进行一次直接插入排序。按增量序列将整个待排记录分割成若干个序列,分别进行直接插入排序。等整个序列基本有序后,再对全体记录进行一次直接插入排序。基本有序:序列中满足基本有序:序列中满足(mnz)(mnz)以下特性的记录较少以下特性的记录较少方法方法(fngf)(fngf):第15页/共70页第十六页,共70页。17目录页张铭、邹艳珍、刘楚雄、闫宏飞、郝丹数据结构与算法Shell排序(pi x)动画 12343229644534781234322964453478
19、123432296445347812343229644534781234322964453478第16页/共70页第十七页,共70页。增量增量(zn lin)(zn lin)序列为:序列为:5 5,3 3,1 14949 3838 6565 9797 76 76 1313 2727 49491313 2727 4949 9797 76 76 4949 38 38 65651313 2727 4949 9797 7676 4949 3838 65 651313 2727 4949 3838 6565 4949 9797 76 7613 27 38 13 27 38 4949 49 65 76 9
20、7 49 65 76 97第17页/共70页第十八页,共70页。void ShellInsert(SqList&L,int dk)void ShellInsert(SqList&L,int dk)/对顺序表对顺序表对顺序表对顺序表L L作一趟希尔插入排序作一趟希尔插入排序作一趟希尔插入排序作一趟希尔插入排序./本算法与一趟直接插入排序比较本算法与一趟直接插入排序比较本算法与一趟直接插入排序比较本算法与一趟直接插入排序比较(bjio),(bjio),作了以下修改作了以下修改作了以下修改作了以下修改 /1./1.前后记录位置的增量是前后记录位置的增量是前后记录位置的增量是前后记录位置的增量是dk,
21、dk,而不是而不是而不是而不是1 1 /2.r0/2.r0只只只只是是是是暂暂暂暂存存存存单单单单元元元元,不不不不是是是是哨哨哨哨兵兵兵兵。当当当当j=0j=0时时时时,插插插插入入入入位位位位置置置置已已已已找到找到找到找到 for(i=dk+1;i=L.length;+i)for(i=dk+1;i0<(L.r0.kry,L.rj.key);j-=dk)for(j=i-dk;j0<(L.r0.kry,L.rj.key);j-=dk)L.rj+dk=L.rj;L.rj+dk=L.rj;/记记记记录录录录后后后后移移移移,查查查查找找找找插插插插入入入入位位位位置置置置 L.rj+dk
22、=L.r0;L.rj+dk=L.r0;/插入插入插入插入 /ShellInsert/ShellInsert第18页/共70页第十九页,共70页。void ShellSort(SqList&L,int dlta,int t)/按按增增量量序序列列dlta0.t-1对对顺顺序序(shnx)表表L作作希希尔尔排序排序 for(k=0;kt;+t)ShellInsert(L,dltak);/一一趟趟增增量量为为daltk的的插插入入排序排序/ShellSort第19页/共70页第二十页,共70页。不稳定空间代价:O(n)时间代价增量序列不合适时,O(n2)选择适当的增量序列,可以使得(shde)时间代
23、价接近O(n)Hibbard增量序列2k-1,2k-1-1,7,3,1Hibbard增量序列的Shell排序的效率可以达到O(n3/2)呈2p3q形式的一系列整数:1,2,3,4,6,8,9,12时间代价为O(nlog2n)算法算法(sun f)分析分析第20页/共70页第二十一页,共70页。10103 3快速排序快速排序(pi x)(pi x)一、起泡排序一、起泡排序(pi x)Bubble Sort(pi x)Bubble Sort算法思想:依次比较相邻的记录(jl),如果不满足排序要求,就交换相邻记录(jl),直到所有的记录(jl)都已经排好序检查每次冒泡过程中是否发生过交换,如果没有,
24、则表明整个数组已经排好序了,排序结束,避免不必要的比较第21页/共70页第二十二页,共70页。void BubbleSort(SqList&L)for(i=1;iL.length;i+)change=FALSE;for(j=1;jL.rj+1.key)change=TRUE;L.rjL.rj+1;if(!change)return;共共 进进 行行(jnxng)n-1(jnxng)n-1趟趟排序,排序,共共 进进 行行(jnxng)n(n-(jnxng)n(n-1)/21)/2次比较次比较T(n)=O(n2)T(n)=O(n2)第22页/共70页第二十三页,共70页。算法算法(sun f)分析
25、分析稳定空间(kngjin)代价:O(n)时间代价:比较次数最少:O(n)最多:交换(jiohun)次数最多为O(n2),最少为0,平均为O(n2)最坏,平均时间代价均为O(n2)最好时间代价为O(n)第23页/共70页第二十四页,共70页。二、快速二、快速二、快速二、快速(kui s)(kui s)排序排序排序排序Quick SortQuick Sort基本思想:基本思想:通过一趟排序将待排序记录分成独立的两部分,通过一趟排序将待排序记录分成独立的两部分,其中一部分记录的关键字均小于另一部分记录其中一部分记录的关键字均小于另一部分记录 的关键字,然后的关键字,然后(rnhu)分别对这两部分进
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 内部 排序 分析 学习 教案
限制150内