版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
10.1概述
10.2插入排序
10.3快速排序
10.4选择排序
10.5归并排序
第10章内部排序10.1概述一、分类:内部排序:
全部记录都可以同时调入内存进行的排序。外部排序:
文件中的记录太大,无法全部将其同时调入内存,需要多次进行内外存交换的排序。二、定义:
设有记录序列:{R1,R2,…,Rn},其相应的关键字序列为:{K1,K2,…,Kn};若存在一种确定的关系:Kp1<=Kp2<=
…<=Kpn
,则将记录序列:{R1,R2,…,Rn}排成按该关键字有序的序列:{Rp1,Rp2,…,Rpn
}的操作,称之为排序。
其中,关系是任意的,如通常经常使用的小于、大于等关系。10.1概述10.1概述三、稳定与不稳定排序若记录序列中的任意两个记录Ri、Rj
的关键字Ki=Kj
;如果在排序之前和排序之后,它们的相对位置保持不变,则这种排序方法是稳定的,否则是不稳定的。#defineMAXSIZE20typedefintKeyType;typedefstruct{KeyTypekey;InfoTypeotherinfo;}RedType;typedefstruct{
RedTyper[MAXSIZE+1];
//r[0]空或作哨兵intlength;}SqList;四、待排记录的数据类型--存储结构见P.264
10.1概述方法:将一个记录插入到已排好序的有序表中。初始:有序表中只有1个记录。排序过程:每一遍,排好序的序列将增加一个元素。如果序列中有n个元素,那么最多进行n-1遍即可。10.2插入排序1.直接插入排序0123624106123456012362410612345362424i1.直接插入排序例:1061210.2插入排序70123624106123453624i1061210.2插入排序1.直接插入排序8012362410612345243624ij1061210.2插入排序1.直接插入排序9012362410612345243610i1061210.2插入排序1.直接插入排序10012362410612345243610ij61210.2插入排序1.直接插入排序11012362410612345362410ij61210.2插入排序1.直接插入排序12012362410612345362410i10j61210.2插入排序1.直接插入排序1301236241061234536246i106j1210.2插入排序1.直接插入排序14012362410612345362410i6j1210.2插入排序1.直接插入排序1501236241061234510246i36j1210.2插入排序1.直接插入排序1601236241061234536246i10j1210.2插入排序1.直接插入排序1701236241061234536246i610j1210.2插入排序1.直接插入排序1801236241061234561012i361224j10.2插入排序1.直接插入排序1901236241061234561012i3624j10.2插入排序1.直接插入排序2001236241061234561012i2436j10.2插入排序1.直接插入排序2101236241061234561012i243612j10.2插入排序1.直接插入排序2201236241063451236241210612Status
InsertSort(SqList&L){
for
(i=2;i<=L.length;++i)
if(LT(L.r[i].key,L.r[i-1].key))
{
L.r[0].key=L.r[i].key;L.r[i].key=L.r[i-1].key;
for(j=i-2;LT(L.r[0].key,L.r[j].key);--j)L.r[j+1]=L.r[j];L.r[j+1]=L.r[0];
}}//InsertSort直接插入排序算法--P.265算法10.12310203040012345102040505030分析:移动、比较次数可作为衡量时间复杂性的标准正序时:比较次数∑1=n-1 i=2
移动次数0
n逆序时:比较次数∑
i=(n+2)(n-1)/2 i=2
移动次数∑(i+1)=(n+4)(n-1)/2 i=2nnO(n2)10.2插入排序直接插入排序算法分析:24362410612362412high1061212方法:在已排序的序列中查找下一个元素的插入位置,将该元素插入进去,形成更长的排序序列。如:12
的插入位置为下标
3。减少了比较次数,未降低时间复杂性。ilow2.折半插入排序01234510.2插入排序25362410612362412high1061212ilow12362412high10612ilow12362412high10612ilow
m2.折半插入排序注意:找到位置时,high
指针总是指向小于待查关键字的那个最大关键字的下标地址。
m012345退出循环后移3624121061226362410612362425high1062525ilow12362425high10625ilow1236242510625ihighlow
m
m1236242510625ihighlow2、折半插入排序注意:找到位置时,high
指针总是指向小于待查关键字的那个最大关键字的下标地址。27StatusBInsertSort
(SqList&L){
for
(i=2;i<=L.length;++i)
{L.r[0]=L.r[i];low=1;high=i-1;
while
(low<=high){m=(low+high)/2;if(LT(L.r[0].key,L.r[m].key))
high=m-1;//L.r[0].key<L.r[m].Key左段elselow=m+1;
//L.r[0].key>=L.r[m].Key走向右段}
for(j=i-1;j>=high+1;--j)L.r[j+1]=L.r[j];//后移L.r[high+1]=L.r[0];
}}//BInsertSort折半插入排序算法--P.267算法10.228
3.希尔排序--缩小增量排序基本思想:
对待排记录序列先作“宏观”调整,再作“微观”调整。所谓“宏观”调整,指的是“跳跃式”的插入排序。具体做法为:
将记录序列分成若干子序列,分别对每个子序列进行插入排序。
其中,d
称为增量,它的值在排序过程中,从大到小逐渐缩小,直至最后一趟排序减为1。例如:将n个记录分成d个子序列:{R[1],R[1+d],R[1+2d],…,R[1+kd]}{R[2],R[2+d],R[2+2d],…,R[2+kd]}…{R[d],R[2d],R[3d],…,R[kd],R[(k+1)d]}例如:1625
12
30
471123
36
9
1831
第一趟希尔排序,设增量d=51123
12
9
181625
36
30
4731
第二趟希尔排序,设增量d=3918
121123
162531
304736第三趟希尔排序,设增量d=1
911121618232530313647
1234567891011void
ShellInsert(SqList&L,int
dk){//一趟增量为dk的ShellInsert
for(i=dk+1;i<=n;++i)//对各组同时排序
if(L.r[i].key<L.r[i-dk].key)
{
L.r[0]=L.r[i];//暂存在R[0]
for(j=i-dk;j>0&&(L.r[0].key<L.r[j].key);j-=dk)L.r[j+dk]=L.r[j];//记录后移,查找插入位置L.r[j+dk]=L.r[0];//插入
}
//if}
//P.272算法10.4void
ShellSort(SqList&L,int
dlta[],
intt){//增量为dlta[]的希尔排序
for(k=0;k<t;++t)
ShellInsert(L,dlta[k]);//调用算法10.4
//一趟增量为dlta[k]的插入排序}//--P.272算法10.5e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。0123 45678494938386565979776761313272749491.起泡排序
10.3快速排序340123 4567849384938656597977676131327274949e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。
10.3快速排序1.起泡排序350123 4567849384938656597977676131327274949
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序360123 4567849384938656597977676131327274949
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序370123 4567849384938656597977676131327274949
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序380123 4567849384938656576977697131327274949
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序390123 4567849384938656576977697131327274949
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序400123 4567849384938656576977613971327274949
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序410123 4567849384938656576977613971327274949
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序420123 4567849384938656576977613271327974949
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序430123 4567849384938656576977613271327974949
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序440123 4567849384938656576977613271327499749
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序450123 45678384965761327499738496576132749973849657613274997
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序460123 45678384965761327499738496576132749973849657613274997
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49用起泡排序的方法进行排序。1.起泡排序470123 45678384965761327499738496576132749973849657613274997
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序480123 45678384965761327499738496576132749973849657613274997
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序490123 45678384965761327499738496576132749973849651376274997
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序500123 45678384965761327499738496576132749973849651376274997
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序510123 45678384965761327499738496576132749973849651327764997
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序520123 45678384965761327499738496576132749973849651327764997
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序530123 45678384965761327499738496576132749973849651327497697
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序540123 45678384965761327499713273849496576971327384949657697
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序550123 45678384965761327499713273849496576971327384949657697
10.3快速排序e.g:将序列
49、38、65、97、76、13、27、49
用起泡排序的方法进行排序。1.起泡排序56
0123 45678384965761327499713273849496576971327384949657697
10.3快速排序1.起泡排序结束条件:
在任何一趟进行过程中,未出现交换。570123 45678384965761327499713273849496576979776654949382713正序时时间复杂度:
O(n),逆序时时间复杂度:
O(n2),平均时间复杂性O(n2)。
10.3快速排序起泡排序时间复杂性:580123 45678493838656597977676131327274949highlow49界点e.g:将序列
49、38、65、97、76、13、27、49
用快速排序的方法进行排序。2.快速排序
10.3快速排序49590123 45678493838656597977676131327274949highlow49界点2.快速排序
10.3快速排序49600123 45678493838656597977676131327274949highlow49界点2.快速排序
10.3快速排序27610123 45678493838656597977676131327274949highlow49界点2.快速排序
10.3快速排序2762493838656597977676131327274949highlow490123 45678界点2.快速排序
10.3快速排序2763493838656597977676131327274949highlow490123 45678界点2.快速排序
10.3快速排序6564493838656597977676131327274949highlow490123 45678界点2.快速排序
10.3快速排序6565493838656597977676131327274949highlow490123 45678界点2.快速排序
10.3快速排序1366493838656597977676131327274949highlow490123 45678界点2.快速排序
10.3快速排序1367493838656597977676131327274949highlow490123 45678界点2.快速排序
10.3快速排序9768493838656597977676131327274949highlow490123 45678界点2.快速排序
10.3快速排序9769493838656597977676131327274949highlow490123 45678界点2.快速排序
10.3快速排序9770493838656597977676131327274949highlow490123 45678界点2.快速排序
10.3快速排序一趟快速排序71273838136597497676139765274949highlow490123 45678界点2.快速排序
10.3快速排序2772273838136597497676139765274949highlow490123 45678界点2.快速排序
10.3快速排序1373273838136597497676139765274949highlow490123 45678界点2.快速排序
10.3快速排序13740123 45678273838136597497676139765274949highlow490123 45678界点2.快速排序
10.3快速排序3875273838136597497676139765274949highlow490123 45678界点2.快速排序
10.3快速排序2776133827386597497676139765274949highlow490123 45678界点2.快速排序
10.3快速排序76770123 45678133827386597497676139765274949highlow490123 45678界点2.快速排序
10.3快速排序4978133827386597497676139765274949highlow490123 45678界点2.快速排序
10.3快速排序49790123 45678133827386597497676139765274949highlow490123 45678界点2.快速排序
10.3快速排序9780133827386597497676139765274949highlow490123 45678界点2.快速排序
10.3快速排序9781133827386597497676139765274949highlow490123 45678界点2.快速排序
10.3快速排序6582133827386597497676139765274949highlow490123 45678界点2.快速排序
10.3快速排序6583133827386597497676139765274949highlow490123 45678界点2.快速排序
10.3快速排序7684133827386597494976136576274997highlow490123 45678界点2.快速排序
10.3快速排序4985133827386597494976136576274997highlow490123 45678界点2.快速排序
10.3快速排序49860123 45678133827386597494976136576274997highlow490123 456782.快速排序
10.3快速排序87VoidQuickSort(SqList&L)//对顺序表L进行快速排序{
QSort(L,1,L.length);//调用算法10.7}//QuickSort--P.276算法10.8
VoidQSort(SqList&L,intlow,inthigh
){if(low<high){
pivotloc=Partition(L,low,high);//P.274算法10.6(b)
Qsort(L,low,pivotloc-1);
Qsort
(L,pivotloc+1,high)}}//QSort--P.276算法10.7快速排序算法88intPartition(SqList&L,intlow,inthigh){//P.274算法10.6(b)L.r[0]=L.r[low];pivotkey=L.r[low].key;
while(low<high)//从表的两端交替向中间扫描
{
while(low<
high&&L.r[high].key>=
pivotkey)--high;L.r[low]=L.r[high];//low<=high
while(low
<
high
&&L.r[low].key<=pivotkey)++low;L.r[high]=L.r[low
];//low<=high
}L.r[low]=L.r[0];//low=high,枢轴记录放到位returnlow;//返回枢轴位置}//Partition快速排序算法89VoidQuickSort(SqList&L)//对顺序表L进行快速排序{
QSort(L,1,L.length);//调用算法10.7}//QuickSort--P.276算法10.8
VoidQSort(SqList&L,intlow,inthigh
){if(low<high){
pivotloc=Partition(L,low,high);//P.274算法10.6(b)
Qsort(L,low,pivotloc-1);
Qsort
(L,pivotloc+1,high)}}//QSort--P.276算法10.7快速排序算法90时间复杂度:快速排序在平均情况下的时间复杂性为:O(nlogn)阶的。通常认为是在平均情况下最佳的排序方法。112.快速排序
10.3快速排序91
要点:对具有
n个结点的结点序列,执行n-1
次循环。每次循环时挑出具有最大或最小关键字的结点。VoidSelectSort
(SqList&L)//P.277算法7.9{
for(i=1;i<L.length;++i){j=SelectMinKey(L,i);//L.r[i]~L.r[n]内选具最小健值的下标if(i!=j)L.r[i]<=>L.r[j];}}//SelectSort1.简单选择排序
10.4选择排序92
index [0] [1] [2]
[3] [4]2410612UNSORTED1.简单选择排序
10.4选择排序i=193
index [0] [1] [2]
[3] [4]6102412UNSORTEDSORTED1.简单选择排序
10.4选择排序i=294
index [0] [1] [2]
[3] [4]6102412UNSORTEDSORTED1.简单选择排序
10.4选择排序i=295
index [0] [1] [2]
[3] [4]6102412UNSORTEDSORTED1.简单选择排序
10.4选择排序i=396
index [0] [1] [2]
[3] [4]6102412UNSORTEDSORTED1.简单选择排序
10.4选择排序i=397
index [0] [1] [2]
[3] [4]6101224SORTED1.简单选择排序
10.4选择排序98SelectionSort:
HowManyComparisons?3comparesforvalues[1]2comparesforvalues[2]1compareforvalues[3]=3+2+16101224
index [0] [1] [2]
[3] [4]1.简单选择排序
10.4选择排序99时间复杂度含n个元素的比较次数:
Sum
=(n-1)+(n-2)+...+2+1 =O(n2
)1.简单选择排序
10.4选择排序100
堆的定义:n个元素的序列{k1,k2
,……,
kn},当且仅当满足以下关系时,称之为堆:
ki
<=
k2i
ki
>=
k2i
ki
<=
k2i+1
ki
>=
k2i+1(i=1,2,……,n/2)
且分别称之为小顶堆和大顶堆。
e.g:序列
{96,83,27,11,9} 大顶堆
{12,36,24,85,47,30,53,91}小顶堆
或969118327231451247859136245330627318452.堆排序大顶堆小顶堆
10.4选择排序212525*491608123456
例:关键字序列{21,25,49,25*,16,08},试建大根堆。
怎样建堆?
先将原始序列画成完全二叉树的形式:完全二叉树的第一个非终端结点编号必为n/221i=3:49大于08,不必调整;i=2:
25大于25*和16,也不必调整;i=1:21小于25和49,要调整!49而且21还应当向下比较!!2.堆排序
10.4选择排序08252125*1649交换1号与6号记录492525*21160812345649252125*1608初始大顶堆2525*16211365420849例:对刚才建好的大根堆进行排序:2.堆排序
10.4选择排序1625*21082549交换1号与5号记录08
252125*1649从1号到5号重新调整为大顶堆082525*2116491234561625*08252149136542082525*2508
2125*1649082525*21
0816492.堆排序
10.4选择排序08162125*2549交换1号与4号记录25*1621082549从1号到4号重新调整为大顶堆25*1608212549123456081625*2521491365422.堆排序
10.4选择排序08162125*2549交换1号与3号记录21160825*2549从1号到3号重新调整为大顶堆211625*082549123456081625*2521491365422.堆排序
10.4选择排序08162125*2549交换1号与2号记录160821
25*2549从1号到2号重新调整为大顶堆160825*212549123456081625*2521491365422.堆排序
10.4选择排序时间复杂性的分析:时间耗费的代价:
建堆的时间耗费+排序的时间耗费建堆的时间耗费:
建堆的时间复杂性为4n=O(n)
级
排序的时间耗费:
T(n)=O(nlogn)
2.堆排序
10.4选择排序108voidHeapSort(HeapType&H)//P.282算法10.11{
//对顺序表H进行堆排序
for(i=H.length/2;i>0;--i)//调整为初始大顶堆
HeapAdjust(H,i,H.length);//P.282算法10.10
for
(i=H.length;
i>1;
--i){H.r[1]<=>H.r[i];
HeapAdjust
(H,1,i-1);//大顶堆的下标为1~i-1,减少了1}}//HeapSortTypedefSqlist
HeapType;堆排序算法109Void
Heapadjust
(HeapType&H,ints,intm)//P.282算法10.10{//调整H.r[s]的关键字,使H.r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024中国福州外轮代理限公司招聘15人易考易错模拟试题(共500题)试卷后附参考答案
- 2024年度地磅设备分期付款销售合同3篇
- 2024中国电信产业研究院招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国建筑一局(集团)限公司轨道交通项目部总工程师招聘1人易考易错模拟试题(共500题)试卷后附参考答案
- 2024年度生物医药产品临床试验合同
- 2024中国五洲工程设计集团限公司公开招聘若干人易考易错模拟试题(共500题)试卷后附参考答案
- 《实务专题研究》课件
- 2024年度版权许可合同:授权使用音乐作品进行演出
- 2024年度研发合作合同与研发成果分配协议
- 2024年度品牌授权使用合同标的授权范围与使用期限协议
- 室内装修施工安全方案
- 直播电商代运营服务协议(GMV计费模式)
- 2024-2030年中国城市更新行业发展创新模式及投资规划研究报告
- 2024-2030年中国公路养护行业改革创新模式及未来发展规划分析报告
- 北京市海淀区2024-2025学年高三上学期11月期中考试地理试题 含解析
- 工程询价合同模板
- 事业单位招聘《综合基础知识》考试试题及答案
- 西门子S7-1500 PLC技术及应用 课件 第2章 S7-1500 PLC的系统配置与开发环境
- 2024年中国瓦楞包装纸箱市场调查研究报告
- 无锡风机吊装施工方案
- 第九章 职业健康安全与环境管理课件
评论
0/150
提交评论