数据结构与算法分析第八章内部排序.pdf





《数据结构与算法分析第八章内部排序.pdf》由会员分享,可在线阅读,更多相关《数据结构与算法分析第八章内部排序.pdf(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 第八章第八章第八章第八章 内部排序内部排序内部排序内部排序概念术语概念术语概念术语概念术语排 序:排 序:按照结点中的某项值对集合中结点进行升序或降序的排列按照结点中的某项值对集合中结点进行升序或降序的排列关键字:关键字:排序时参照的数据项,有主次之分排序时参照的数据项,有主次之分稳定性:稳定性:如果排序操作使等值结点的相对位置(主要是指前后关系)保持不变,则排序是稳定的,否则是不稳定的。如果排序操作使等值结点的相对位置(主要是指前后关系)保持不变,则排序是稳定的,否则是不稳定的。内部排序:内部排序:排序序列放在内存中排序序列放在内存中外部排序:外部排序:需要对外存进行访问需要对外存进行访问
2、内排序分类内排序分类内排序分类内排序分类按排序过程依据的按排序过程依据的按排序过程依据的按排序过程依据的原则原则原则原则分为:插入排序分为:插入排序分为:插入排序分为:插入排序交换排序交换排序交换排序交换排序选择排序选择排序选择排序选择排序归并排序归并排序归并排序归并排序基数排序基数排序基数排序基数排序按排序过程所需的按排序过程所需的按排序过程所需的按排序过程所需的工作量工作量工作量工作量分:简单排序分:简单排序分:简单排序分:简单排序 O(nO(n2 2)先进排序先进排序先进排序先进排序 O(nlogO(nlogn n)基数排序基数排序基数排序基数排序 O(dO(dn)n)内内内内部部部部排
3、排排排序序序序 插入排序插入排序插入排序插入排序 交换排序交换排序交换排序交换排序 选择排序选择排序选择排序选择排序 归并排序归并排序归并排序归并排序 基数排序基数排序基数排序基数排序有序表中插入元素,并保持其有序有序表中插入元素,并保持其有序将表中关键字比较,位置不对交换将表中关键字比较,位置不对交换先查找关键字,再交换。先查找关键字,再交换。将两个有序的关键字序列进行归并将两个有序的关键字序列进行归并不比较,按多关键字排序方法不比较,按多关键字排序方法直接直接折半折半2-路路希尔希尔冒泡冒泡快速快速简单简单树型树型堆堆 直接插入排序直接插入排序直接插入排序直接插入排序 例:给定以下关键字:
4、例:给定以下关键字:49 38 65 97 76 13 27 49 i=1 (49)(49)38 65 97 76 13 27 49 i=2 (38)(3849)65 97 76 13 27 49 i=3 (65)(38 49 65)97 76 13 27 49 i=4 (97)(38 49 65 97)76 13 27 49 i=5 (76)(38 49 65 7697 )13 27 49 i=6 (13)(1338 49 65 76 97 )27 49 i=7 (27)(13 2738 49 65 76 97 )49 i=8 (49)(13 27 38 49 4965 76 97 )基本思
5、想基本思想基本思想基本思想:依次将每个待排序的记录插入到一个有序子文件依次将每个待排序的记录插入到一个有序子文件依次将每个待排序的记录插入到一个有序子文件依次将每个待排序的记录插入到一个有序子文件的合适位置的合适位置的合适位置的合适位置(有序子文件记录数增有序子文件记录数增有序子文件记录数增有序子文件记录数增1 1 1 1)插入排序1插入排序1O(nO(n2 2)稳定稳定稳定稳定直接插入排序的算法直接插入排序的算法typedef int SortData;void InsertSort(SortData V,int n)/按非递减顺序对表进行排序按非递减顺序对表进行排序SortData tem
6、p;int i,j;for(i=1;i 0;j-)/从后向前顺序比较从后向前顺序比较if(temp Vj-1)Vj=Vj-1;else break;Vj=temp;?算法评价算法评价算法评价算法评价?时间复杂度时间复杂度时间复杂度时间复杂度?若待排序记录按关键字从小到大排列若待排序记录按关键字从小到大排列若待排序记录按关键字从小到大排列若待排序记录按关键字从小到大排列(正序正序正序正序)?关键字比较次数:关键字比较次数:关键字比较次数:关键字比较次数:112=nni?记录移动次数:记录移动次数:记录移动次数:记录移动次数:)1(222=nni?若待排序记录按关键字从大到小排列若待排序记录按关键
7、字从大到小排列若待排序记录按关键字从大到小排列若待排序记录按关键字从大到小排列(逆序逆序逆序逆序)?关键字比较次数关键字比较次数:2)1)(2(2+=nnini?记录移动次数:记录移动次数:记录移动次数:记录移动次数:2)1)(4()1(2+=+=nnini?若待排序记录是随机的,取平均值若待排序记录是随机的,取平均值?关键字比较次数:关键字比较次数:42n?记录移动次数记录移动次数记录移动次数记录移动次数:42nT(n)=O(n)?空间复杂度空间复杂度:S(n)=O(1)S(n)=O(1)?折半插入排序折半插入排序折半插入排序折半插入排序?2 2 2 2-路插入排序路插入排序路插入排序路插入
8、排序 直接插入排序的改进直接插入排序的改进直接插入排序的改进直接插入排序的改进折半插入排序折半插入排序折半插入排序折半插入排序(Binary Binary Binary Binary InsertsortInsertsortInsertsortInsertsort)基本思想基本思想设在顺序表中有一 个对象序列设在顺序表中有一 个对象序列 V0,V1,Vn-1。其中。其中,V0,V1,Vi-1 是已经排好序的对象。在插入是已经排好序的对象。在插入Vi 时时,利用折半搜索法寻找利用折半搜索法寻找Vi 的插入位置。的插入位置。折半插入排序的算法折半插入排序的算法typedef int SortDat
9、a;void BinInsSort(SortData V,int n)SortData temp;int Left,Right;for(int i=1;i n;i+)Left=0;Right=i-1;temp=Vi;while(Left=Right)int mid=(Left+Right)/2;if(temp=Left;k-)Vk+1=Vk;/记录后移记录后移VLeft=temp;/插入插入 2 2 2 2-路插入排序路插入排序路插入排序路插入排序 例:给定以下关键字:例:给定以下关键字:初始状态初始状态49 38 65 97 76 13 27 49 i=1 (49 )i=2 (49 )(38
10、)i=3 (49 65)(38)i=4 (49 65 97)(38)i=5 (49 65 76 97)(38)i=6 (49 65 76 97)(13 38)i=7 (49 65 76 97)(13 27 38)i=8 (49 4965 76 9713 27 38)final first 插入排序2插入排序2 希尔排序希尔排序希尔排序希尔排序基本思想基本思想:分割成若干个较小的子文件,对各个子文件分别进行直接插入排序,当文件达到基本有序时,再对整个文件进行一次直接插入排序。:分割成若干个较小的子文件,对各个子文件分别进行直接插入排序,当文件达到基本有序时,再对整个文件进行一次直接插入排序。49
11、 38 65 97 76 13 27 49 55 4d=3一趟排序结果:二趟排序结果:d=1d=513 27 49 55 4 49 38 65 97 76三趟排序结果:13 4 4938 27 49 55 65 97 764 13 27 38 4949 55 65 76 97 插入排序3插入排序3typedef int SortData;void ShellSort(SortData V,int n)SortData temp;int gap=n/2;/gap是间隔是间隔while(gap!=0)/循环循环,直到直到gap为零为零for(int i=gap;i=gap;j=j-gap)if(t
12、emp 1&change;-i)/bubble_sort for(i=n-1,change=TRUE;i1&change;-i)/bubble_sort change=FALSEchange=FALSE;/change 为元素进行交换标志/change 为元素进行交换标志forfor(j=0;j aj+1)(j=0;j aj+1)aj aj+1;change=TRUEaj aj+1;change=TRUE;/一趟起泡;/一趟起泡时间复杂度:时间复杂度:O(nO(n2 2)?算法描述?算法评价?时间复杂度时间复杂度?最好情况(正序最好情况(正序)?比较次数:n-1?移动次数:0?最坏情况(逆序最
13、坏情况(逆序)?比较次数:)(21)(211nninni=?移动次数:)(23)(321nninni=?空间复杂度空间复杂度:S(n)=O(1)T(n)=O(n)快速排序快速排序快速排序快速排序交换排序2交换排序2快速排序是目前内部排序中最快的方法。快速排序是目前内部排序中最快的方法。基本思想:基本思想:基本思想:基本思想:选取某个记录,(通常选文件的第一个记录),将所有关键字不大于它的记录放在它的前面,将所有关键字不小于它的记录放在它的后面,这样遍历一趟文件后,将文件以该记录为界分为两部分,然后对各部分重复上述过程,直到每一部分仅剩一个记录为止。选取某个记录,(通常选文件的第一个记录),将所
14、有关键字不大于它的记录放在它的前面,将所有关键字不小于它的记录放在它的后面,这样遍历一趟文件后,将文件以该记录为界分为两部分,然后对各部分重复上述过程,直到每一部分仅剩一个记录为止。快速排序的效率跟初始文件中关键字的排列有关。快速排序的效率跟初始文件中关键字的排列有关。?快速排序?排序过程:对rst中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=rs,x=rp.key?初始时令i=s,j=t?首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp交换?再从i所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换?重复上述两步,直至i=j为止?再分别对两个子序列进行快速排序
15、,直到每个子序列只含有一个记录为止例初始关键字:4938 65 97 76 13 27 50 ijxji完成一趟排序:(27 38 13)49(76 97 65 50)分别进行快速排序:(13)27 (38)49(50 65)76 (97)快速排序结束:1327 38 4950 6576 974927ijijij4965ji1349ij4997ijVoid QuickSort(ElemType a,int s,int t)/采用快速排序方法对数组a中as-at区间进行排序/开始进行非递归调用时s和t的初值应分别为0和n-1/对当前排序区间进行一次划分Int I=s,j=t+1;/给I 和 j初
16、值ElemType x=as;/把基准元素的值暂存X中DoDo j-;while(aj.stn x.stn);/从后先前顺序查找一个要向前一区间交换的元素Do i+;whie(ai.stn x.stn);/从前先后顺序查找一个要向后一区间交换的元素If(ij)/当条件成立时交换ai aj的值ElemType temp=ai;ai=aj;aj=temp;While(ij);/条件成立时继续进行一次划分中的比较和交换As=aj;aj=x;/交换as和aj的值,得到前后两后两个子区间If(sj-1)QuickSort(a,s,j-1);/在当前左区间内超过一个元素的情况下递归处理左区间If(j+1)
17、QuickSort(a,j+1,t)/在当前右区间内超过一个元素的情况下递归处理右区间?void QSort(SqList&L,intlow,inthigh)/对顺序表L中的子序列L.rrow,high作快速排序if(lowhigh)/长度大于1?pivotloc=Partition(L,low,high);/将L.rlow,high一分为二?QSort(L,low,pivotloc-1);/对低子表递归排序,pivotloc是枢轴位置?QSort(L,pivotloc,high);/对高字表递归排序 intPartition(Sqlist&L,intlow,inthigh)/交换顺序表中字表
18、rlow,high的记录,枢轴记录到位,并返回其所在位,L.r0=L.rlow;/用第一个记录作枢轴记录pivotkey=L.rlow.key;/枢轴记录关键字while(lowhigh)/从表的两端交替向中间扫描while(low=pivotkey)-high;L.rlow=L.rhigh;/将比枢轴记录小的记录移到底端while(lowhigh&L.rlow.key=pivotkey)+low;L.rhigh=L.rlow;/将比枢轴记录大的记录移到高端 L.rlow=L.r0;/枢轴记录到位return low;/返回枢轴位置?算法描述?算法评价?时间复杂度?最好情况(每次总是选到中间值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 分析 第八 内部 排序

限制150内