数据结构与算法内部排序分析.pptx





《数据结构与算法内部排序分析.pptx》由会员分享,可在线阅读,更多相关《数据结构与算法内部排序分析.pptx(70页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、10101 1概述概述一、排序的定义一、排序的定义一、排序的定义一、排序的定义 假设有假设有假设有假设有n n个记录的序列为:个记录的序列为:个记录的序列为:个记录的序列为:RR1 1,R R2 2,,R,Rn n 其对应的其对应的其对应的其对应的关键字关键字关键字关键字为为为为KK1 1,K K2 2,,K,Kn n 需要确定需要确定需要确定需要确定1 1,2 2,,n,n的一种排列的一种排列的一种排列的一种排列P P1 1,P P2 2,,P,Pn n 使:使:使:使:K Kp1p1 K K p2 p2K K p n p n 则则则则RR p1 p1,R R p2 p2,,R,R pn p
2、n 为一个按关键字有序的序列。为一个按关键字有序的序列。为一个按关键字有序的序列。为一个按关键字有序的序列。其中,其中,其中,其中,K Ki i可以是记录可以是记录可以是记录可以是记录R Ri i的主关键字、次关键字或若干数的主关键字、次关键字或若干数的主关键字、次关键字或若干数的主关键字、次关键字或若干数据项的组合。据项的组合。据项的组合。据项的组合。第1页/共70页二、排序方法的稳定性二、排序方法的稳定性二、排序方法的稳定性二、排序方法的稳定性 若若若若K K K Ki i i i=K=K=K=Kj j j j,(1,(1,(1,(1 i i i i j j j j n),n),n),n)
3、,且排序前,且排序前,且排序前,且排序前,R R R Ri i i i在在在在R R R Rj j j j前面,前面,前面,前面,若排序后,若排序后,若排序后,若排序后,R R R Ri i i i仍在仍在仍在仍在R R R Rj j j j前面前面前面前面 则称该排序算法是稳定的,否则是不稳定的。则称该排序算法是稳定的,否则是不稳定的。则称该排序算法是稳定的,否则是不稳定的。则称该排序算法是稳定的,否则是不稳定的。三、排序分类三、排序分类三、排序分类三、排序分类根据待排序的记录的数量划分根据待排序的记录的数量划分根据待排序的记录的数量划分根据待排序的记录的数量划分:内部排序:内部排序:内部排
4、序:内部排序:待排序的记录存放在计算机的内存中的排序过程待排序的记录存放在计算机的内存中的排序过程待排序的记录存放在计算机的内存中的排序过程待排序的记录存放在计算机的内存中的排序过程外部排序:外部排序:外部排序:外部排序:待待待待排排排排序序序序的的的的记记记记录录录录数数数数量量量量很很很很大大大大,内内内内存存存存一一一一次次次次放放放放不不不不下下下下全全全全部部部部记记记记录录录录,在排序过程中还需访问外存的排序过程。在排序过程中还需访问外存的排序过程。在排序过程中还需访问外存的排序过程。在排序过程中还需访问外存的排序过程。第2页/共70页四、内部排序方法四、内部排序方法四、内部排序方
5、法四、内部排序方法 插入排序插入排序插入排序插入排序 交换排序交换排序交换排序交换排序 选择排序选择排序选择排序选择排序 归并排序归并排序归并排序归并排序 基数排序基数排序基数排序基数排序五、待排序记录的存储方式五、待排序记录的存储方式五、待排序记录的存储方式五、待排序记录的存储方式 存放在地址连续的一组存储单元存放在地址连续的一组存储单元存放在地址连续的一组存储单元存放在地址连续的一组存储单元-约定约定约定约定 存放在静态链表存放在静态链表存放在静态链表存放在静态链表 存放在地址连续的一组存储单元,另设一组索引指针存放在地址连续的一组存储单元,另设一组索引指针存放在地址连续的一组存储单元,另
6、设一组索引指针存放在地址连续的一组存储单元,另设一组索引指针第3页/共70页#define MAXSIZE 20#define MAXSIZE 20 /一个用作示例的小顺序表的最大长度一个用作示例的小顺序表的最大长度一个用作示例的小顺序表的最大长度一个用作示例的小顺序表的最大长度typedef int KeyType;typedef int KeyType;/定义关键字类型为整数类型定义关键字类型为整数类型定义关键字类型为整数类型定义关键字类型为整数类型typedef structtypedef struct KeyType KeyType key key;/关键字关键字关键字关键字 Info
7、Type InfoType otherinfootherinfo;/其它数据项其它数据项其它数据项其它数据项 RedTypeRedType;/记录类型记录类型记录类型记录类型typedef structtypedef struct RedType RedType rMAXSIZE;rMAXSIZE;/r0/r0赋闲或用作哨兵单元赋闲或用作哨兵单元赋闲或用作哨兵单元赋闲或用作哨兵单元 int int lengthlength;/顺序表长度顺序表长度顺序表长度顺序表长度 SqListSqList;第4页/共70页10102 2插入排序插入排序insert sortinginsert sorting
8、一、直接插入排序一、直接插入排序一、直接插入排序一、直接插入排序 方法:方法:方法:方法:将一个记录插入已排好序的有序表中,得到一个将一个记录插入已排好序的有序表中,得到一个将一个记录插入已排好序的有序表中,得到一个将一个记录插入已排好序的有序表中,得到一个新的记录数增加新的记录数增加新的记录数增加新的记录数增加1 1 1 1的有序表的有序表的有序表的有序表(1 1 1 1)把序列把序列把序列把序列(R(K(R(K(R(K(R(K1 1 1 1)看成是一个有序的子序列看成是一个有序的子序列看成是一个有序的子序列看成是一个有序的子序列 把把把把R(KR(KR(KR(K2 2 2 2)插入到该序列
9、中插入到该序列中插入到该序列中插入到该序列中,使插入后序列使插入后序列使插入后序列使插入后序列 (R(K(R(K(R(K(R(K1 1 1 1),R(K),R(K),R(K),R(K2 2 2 2)有序有序有序有序(2 2 2 2)把把把把R(KR(KR(KR(K3 3 3 3)插入到插入到插入到插入到(R(K(R(K(R(K(R(K1 1 1 1),R(K),R(K),R(K),R(K2 2 2 2)中中中中,使插入后有序使插入后有序使插入后有序使插入后有序(3 3 3 3)重复()重复()重复()重复(2 2 2 2),直到插入),直到插入),直到插入),直到插入R(KR(KR(KR(Kn
10、 n n n)为止。为止。为止。为止。第5页/共70页6目录页张铭、邹艳珍、刘楚雄、闫宏飞、郝丹数据结构与算法插入排序动画 1234322964453478第6页/共70页45,34,78,12,34,32,29,64 45 45 34 45 34 45 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 1
11、2 29 32 34 34 45 64 78第7页/共70页void InsertSort(SqList&L)void InsertSort(SqList&L)/对顺序表对顺序表对顺序表对顺序表L L做直接插入排序做直接插入排序做直接插入排序做直接插入排序 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插入有序子表插入有序子表插入有序子表插入有序子表 L.r0=L.ri;L.r0=L.ri;for(j=i-1;LT(L.r0
12、.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;/记录后移记录后移记录后移记录后移 L.rj+1=L.r0;L.rj+1=L.r0;/插入到正确位置插入到正确位置插入到正确位置插入到正确位置 /InsertSort/InsertSort第8页/共70页算法分析稳定空间代价:O(n)时间代价:最佳情况:n-1次比较,O(n)最差情况:O(n2)比较次数为平均情况:O(n2)第9页/共70页例:在序列例:在序列例:在序列例:在序列13131313,27272727,35353535,48484
13、848,65656565,72727272中插入中插入中插入中插入20202020或或或或606060603565132748722060二、折半插入排序二、折半插入排序二、折半插入排序二、折半插入排序Binary InsertsortBinary Insertsort 用折半查找的方法找到插入位置用折半查找的方法找到插入位置用折半查找的方法找到插入位置用折半查找的方法找到插入位置第10页/共70页void BInsertSort(SqList&L)void BInsertSort(SqList&L)/对顺序表对顺序表对顺序表对顺序表L L做折半插入排序做折半插入排序做折半插入排序做折半插入排
14、序 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(while(low=hightlow=hight+1;-j)L.rj+1=L.rj;for(j=i-1;j=hight+1;-j)L.rj+1=L.rj;/记录后移记录后移记录后移记录后移 L.rhight+1=L.r0;L.rhight+1=L.r0;/插插插插入入入入到到到到正正正正确确确确位位位位置置置置 /BIns
15、ertSort/BInsertSort第11页/共70页四、希尔排序(缩小增量排序四、希尔排序(缩小增量排序ShellSort)思想:先将序列转化为若干小序列,在这些小序列内进行插入排序逐渐增加小序列的规模,而减少小序列个数,使得待排序序列逐渐处于更有序的状态最后对整个序列进行一趟直接插入排序直接插入排序的两个特点:在最好情况下时间代价为O(n)对于短序列,直接插入排序比较有效第14页/共70页 按增量序列将整个待排记录分割成若干个序列,分别进行直接插入排序。等整按增量序列将整个待排记录分割成若干个序列,分别进行直接插入排序。等整个序列基本有序后,再对全体记录进行一次直接插入排序。个序列基本有
16、序后,再对全体记录进行一次直接插入排序。基本有序基本有序基本有序基本有序:序列中满足以下特性的记录较少:序列中满足以下特性的记录较少方法:方法:第15页/共70页16目录页张铭、邹艳珍、刘楚雄、闫宏飞、郝丹数据结构与算法Shell排序动画 12343229644534781234322964453478123432296445347812343229644534781234322964453478第16页/共70页增量序列为:增量序列为:5 5,3 3,1 14949 3838 6565 9797 76 76 1313 2727 49491313 2727 4949 9797 76 76 49
17、49 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 97 49 65 76 97第17页/共70页void ShellInsert(SqList&L,int dk)void ShellInsert(SqList&L,int dk)/对顺序表对顺序表对顺序表对顺序表L L作一趟希尔插入排序作一趟希尔插入排序作一趟希尔插入排序作一趟希尔插入排序./本算法与一趟直接插入排序比较本算法与一趟直接插入排序比较
18、本算法与一趟直接插入排序比较本算法与一趟直接插入排序比较,作了以下修改作了以下修改作了以下修改作了以下修改 /1./1.前后记录位置的增量是前后记录位置的增量是前后记录位置的增量是前后记录位置的增量是dk,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-=;j0<(L
19、.r0.kry,L.rj.key);j-=dkdk)L.rj+L.rj+dkdk=L.rj;=L.rj;/记录后移,查找插入位置记录后移,查找插入位置记录后移,查找插入位置记录后移,查找插入位置 L.rj+L.rj+dkdk=L.r0;=L.r0;/插入插入插入插入 /ShellInsert/ShellInsert第18页/共70页void ShellSort(SqList&L,int dlta,int t)/按增量序列按增量序列dlta0.t-1对顺序表对顺序表L作希尔排序作希尔排序 for(k=0;kt;+t)ShellInsert(L,dltak);/一趟增量为一趟增量为daltk的插入
20、排序的插入排序/ShellSort第19页/共70页不稳定空间代价:O(n)时间代价增量序列不合适时,O(n2)选择适当的增量序列,可以使得时间代价接近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)算法分析第20页/共70页10103 3快速排序快速排序一、起泡排序一、起泡排序一、起泡排序一、起泡排序Bubble SortBubble SortBubble SortBubble Sort算法思想:依次比较相邻的记录,如果不满
21、足排序要求,就交换相邻记录,直到所有的记录都已经排好序检查每次冒泡过程中是否发生过交换,如果没有,则表明整个数组已经排好序了,排序结束,避免不必要的比较第21页/共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;共进行共进行n-1n-1趟排序,趟排序,共进行共进行n(n-1)/2n(n-1)/2次比较次比较T(n)=O(nT(n)=O(n2 2)第22页/共70页算法分析稳定空间代价:O(n)时间代
22、价:比较次数最少:O(n)最多:交换次数最多为O(n2),最少为0,平均为O(n2)最坏,平均时间代价均为O(n2)最好时间代价为O(n)第23页/共70页二、快速排序二、快速排序二、快速排序二、快速排序Quick SortQuick Sort基本思想:基本思想:通过一趟排序将待排序记录分成独立的两部分,通过一趟排序将待排序记录分成独立的两部分,其中一部分记录的关键字均小于另一部分记录其中一部分记录的关键字均小于另一部分记录 的关键字,然后分别对这两部分进行递归排序的关键字,然后分别对这两部分进行递归排序 一趟排序:一趟排序:一趟排序:一趟排序:任意选取一个记录作为枢轴(支点)任意选取一个记录
23、作为枢轴(支点)任意选取一个记录作为枢轴(支点)任意选取一个记录作为枢轴(支点)pivot,pivot,将所有关键将所有关键将所有关键将所有关键字小于它的记录排在它的前面字小于它的记录排在它的前面字小于它的记录排在它的前面字小于它的记录排在它的前面,将所有关键字大于它的将所有关键字大于它的将所有关键字大于它的将所有关键字大于它的记录排在它的后面。即以枢轴记录为分界线,使原序列记录排在它的后面。即以枢轴记录为分界线,使原序列记录排在它的后面。即以枢轴记录为分界线,使原序列记录排在它的后面。即以枢轴记录为分界线,使原序列L.rs,L.rs+1,L.rtL.rs,L.rs+1,L.rt分成两个子序列
24、:分成两个子序列:分成两个子序列:分成两个子序列:L.rs,L.rs+1,L.ri-1L.rs,L.rs+1,L.ri-1和和和和 L.ri+1,L.ri+2,L.rtL.ri+1,L.ri+2,L.rt 枢轴记录在位置枢轴记录在位置枢轴记录在位置枢轴记录在位置i i第24页/共70页49 38 65 97 76 13 27 49i27 38 65 97 76 13 49 4927 38 49 97 76 13 65 49jiiijjijj27 38 13 97 76 49 65 49iji27 38 13 49 76 97 65 49ij27 38 1376 97 65 76 97 65 4
25、949jj第25页/共70页具体实现:具体实现:具体实现:具体实现:low=s;high=t;pivotkey=L.rlow.key;low=s;high=t;pivotkey=L.rlow.key;(1)(1)从从从从highhigh开开开开始始始始往往往往前前前前找找找找第第第第一一一一个个个个关关关关键键键键字字字字小小小小于于于于pivotkeypivotkey的的的的记记记记录,与枢轴记录交换录,与枢轴记录交换录,与枢轴记录交换录,与枢轴记录交换 (2)(2)从从从从lowlow开开开开始始始始往往往往后后后后找找找找第第第第一一一一个个个个关关关关键键键键字字字字大大大大于于于于p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 内部 排序 分析

限制150内