数据结构课件:10.内部排序.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构课件:10.内部排序.ppt》由用户(罗嗣辉)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课件 10. 内部 排序
- 资源描述:
-
1、第九章第九章一、排序一、排序( (Sorting)Sorting)2第一节排序第一节排序n排序排序:将一个数据元素(或记录)的任意序列,:将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列重新排列成一个按关键字有序的序列n内部排序内部排序:在排序期间数据对象全部存放在内:在排序期间数据对象全部存放在内存的排序;存的排序;n外部排序外部排序:在排序期间全部对象个数太多,不:在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,能同时存放在内存,必须根据排序过程的要求,不断在内、外存之间移动的排序。不断在内、外存之间移动的排序。第第9章内部排序章内部排序二、排序
2、基本操作二、排序基本操作3第一节排序第一节排序排序的基本操作包括:n比较:比较两个关键字的大小比较:比较两个关键字的大小n移动:将记录从一个位置移动至另一个位置移动:将记录从一个位置移动至另一个位置第第9章内部排序章内部排序三、排序时间复杂度三、排序时间复杂度4第一节排序第一节排序n排序的时间复杂度可用算法执行中的记录关键排序的时间复杂度可用算法执行中的记录关键字比较次数与记录移动次数来衡量。字比较次数与记录移动次数来衡量。第第9章内部排序章内部排序四、排序方法的稳定性四、排序方法的稳定性5第一节排序第一节排序n如果在记录序列中有两个记录如果在记录序列中有两个记录riri和和rj, rj, 它
3、它们的关键字们的关键字 keyi = keyj , keyi = keyj , 且在排序之且在排序之前前, , 记录记录riri排在排在rjrj前面。前面。n如果在排序之后如果在排序之后, , 记录记录riri仍在记录仍在记录rjrj的前的前面面, , 则称这个排序方法是稳定的则称这个排序方法是稳定的, , n否则称这个排序方法是不稳定的。否则称这个排序方法是不稳定的。第第9章内部排序章内部排序6第二节插入排序第二节插入排序n每步将一个待排序的对象每步将一个待排序的对象, , 按其关键字大小按其关键字大小, , 插入到前面已经排好序的有序表的适当位置上插入到前面已经排好序的有序表的适当位置上,
4、 , 直到对象全部插入为止。直到对象全部插入为止。第第9章内部排序章内部排序一、直接插入排序一、直接插入排序7第二节插入排序第二节插入排序n当插入第当插入第i(i1)i(i1)个对象时个对象时, , 前面的前面的r0, r0, r1, r1, , ri-1, ri-1已经排好序。已经排好序。n用用riri的关键字与的关键字与ri-1, ri-2, ri-1, ri-2, 的关键的关键字顺序进行比较字顺序进行比较( (和顺序查找类似和顺序查找类似) ),如果小于,如果小于,则将则将rxrx向后移动向后移动( (插入位置后的记录向后顺插入位置后的记录向后顺移移) )n找到插入位置即将找到插入位置即
5、将riri插入插入第第9章内部排序章内部排序一、直接插入排序一、直接插入排序( (举例举例) )8第二节插入排序第二节插入排序n已知待序的一组记录的初始排列为:已知待序的一组记录的初始排列为:21, 25, 21, 25, 49, 2549, 25* *, 16, 08, 16, 08第第9章内部排序章内部排序0 1 2 3 4 5一、直接插入排序一、直接插入排序( (举例举例) )9第二节插入排序第二节插入排序第第9章内部排序章内部排序0 1 2 3 4 5 temp2525250 1 2 3 4 5 temp494949一、直接插入排序一、直接插入排序( (举例举例) )10第二节插入排序
6、第二节插入排序第第9章内部排序章内部排序252525* * *0 1 2 3 4 50 1 2 3 4 5 temp161616一、直接插入排序一、直接插入排序( (举例举例) )11第二节插入排序第二节插入排序第第9章内部排序章内部排序0 1 2 3 4 5 temp0808080 1 2 3 4 5完成一、直接插入排序一、直接插入排序( (算法实现算法实现) )12第二节插入排序第二节插入排序void InsertSort (int r , int m ) void InsertSort (int r , int m ) / / 假设关键字为整型,放在向量假设关键字为整型,放在向量rr中中
7、 int n, j, temp; int n, j, temp; for ( n = 1; n m; n+ ) for ( n = 1; n 0; j- ) / for ( j = n; j 0; j- ) /从后向前顺序比较,并依次后移从后向前顺序比较,并依次后移 if ( temp rj-1 ) rj = rj-1;if ( temp rj-1 ) rj = rj-1; else break; else break; rj = temp; rj = temp; 第第9章内部排序章内部排序一、直接插入排序一、直接插入排序( (算法分析算法分析) )13第二节插入排序第二节插入排序n关键字比较
8、次数和记录移动次数与记录关键字关键字比较次数和记录移动次数与记录关键字的初始排列有关。的初始排列有关。n最好情况下最好情况下, , 排序前记录已按关键字从小到大排序前记录已按关键字从小到大有序有序, , 每趟只需与前面有序记录序列的最后一每趟只需与前面有序记录序列的最后一个记录比较个记录比较1 1次次, , 移动移动2 2次记录次记录, , 总的关键字比总的关键字比较次数为较次数为 n-1, n-1, 记录移动次数为记录移动次数为 2( 2(n-1)n-1)。第第9章内部排序章内部排序一、直接插入排序一、直接插入排序( (算法分析算法分析) )14第二节插入排序第二节插入排序n最坏情况下最坏情
9、况下, , 第第i i趟时第趟时第i i个记录必须与前面个记录必须与前面i i个记录都做关键字比较个记录都做关键字比较, , 并且每做并且每做1 1次比较就次比较就要做要做1 1次数据移动。则总关键字比较次数次数据移动。则总关键字比较次数KCNKCN和和记录移动次数记录移动次数RMNRMN分别为分别为第第9章内部排序章内部排序111122142221nininnniRMNnnniKCN/)()( ,/)(22一、直接插入排序一、直接插入排序( (算法分析算法分析) )15第二节插入排序第二节插入排序n在平均情况下的关键字比较次数和记录移动次在平均情况下的关键字比较次数和记录移动次数约为数约为
10、n n2 2/4/4。n直接插入排序的时间复杂度为直接插入排序的时间复杂度为O(nO(n2 2) )。n直接插入排序是一种稳定的排序方法直接插入排序是一种稳定的排序方法n直接插入排序最大的优点是简单,在记录数较直接插入排序最大的优点是简单,在记录数较少时,是比较好的办法少时,是比较好的办法第第9章内部排序章内部排序二、折半插入排序二、折半插入排序16第二节插入排序第二节插入排序n折半插入排序在查找记录插入位置时,采用折折半插入排序在查找记录插入位置时,采用折半查找算法半查找算法n折半查找比顺序查找快折半查找比顺序查找快, , 所以折半插入排序在所以折半插入排序在查找上性能比直接插入排序好查找上
11、性能比直接插入排序好n但需要移动的记录数目与直接插入排序相同但需要移动的记录数目与直接插入排序相同( (为为O(nO(n2 2)n折半插入排序的时间复杂度为折半插入排序的时间复杂度为O(nO(n2 2) )。n折半插入排序是一种稳定的排序方法折半插入排序是一种稳定的排序方法第第9章内部排序章内部排序三、希尔排序三、希尔排序17第二节插入排序第二节插入排序n从直接插入排序可以看出,当待排序列为正序从直接插入排序可以看出,当待排序列为正序时,时间复杂度为时,时间复杂度为O(n)O(n)n若待排序列基本有序时,插入排序效率会提高若待排序列基本有序时,插入排序效率会提高n希尔排序方法是先将待排序列分成
12、若干子序列希尔排序方法是先将待排序列分成若干子序列分别进行插入排序,待整个序列基本有序时,分别进行插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序再对全体记录进行一次直接插入排序n希尔排序又称为缩小增量排序。希尔排序又称为缩小增量排序。第第9章内部排序章内部排序三、希尔排序三、希尔排序( (算法算法) )18第二节插入排序第二节插入排序n首先取一个整数首先取一个整数 gap n(gap 1; i- - ) for ( i = m; i 1; i- - ) for ( j = 1; j m; j+ ) for ( j = 1; j rj+1 )if ( rj rj+1 ) rj
13、rj+1; rj rj+1; 第第9章内部排序章内部排序一、起泡排序一、起泡排序27第三节快速排序第三节快速排序第第9章内部排序章内部排序初始关键字第一趟排序第四趟排序第二趟排序第三趟排序第五趟排序一、起泡排序一、起泡排序( (性能分析性能分析) )28第三节快速排序第三节快速排序n最好情况:在记录的初始排列已经按关键字从最好情况:在记录的初始排列已经按关键字从小到大排好序时小到大排好序时, ,此算法只执行一趟起泡此算法只执行一趟起泡, ,做做n-n-1 1次关键字比较次关键字比较, ,不移动记录不移动记录第第9章内部排序章内部排序一、起泡排序一、起泡排序( (性能分析性能分析) )29第三节
14、快速排序第三节快速排序n最坏情况:执行最坏情况:执行n-1n-1趟起泡趟起泡, ,第第i i趟做趟做n-in-i次关键次关键字比较字比较, , 执行执行n-in-i次记录交换,共计:次记录交换,共计:n起泡排序的时间复杂度为起泡排序的时间复杂度为O(nO(n2 2) )n起泡排序是一种稳定的排序方法起泡排序是一种稳定的排序方法第第9章内部排序章内部排序11111233121nininninRMNnninKCN)()()()(二、快速排序二、快速排序30第三节快速排序第三节快速排序n任取待排序记录序列中的某个记录任取待排序记录序列中的某个记录( (例如取第例如取第一个记录一个记录) )作为基准作
15、为基准( (枢枢),),按照该记录的关键字按照该记录的关键字大小大小, ,将整个记录序列划分为左右两个子序列:将整个记录序列划分为左右两个子序列: n左侧子序列中所有记录的关键字都小于或等于左侧子序列中所有记录的关键字都小于或等于基准记录的关键字基准记录的关键字 n右侧子序列中所有记录的关键字都大于基准记右侧子序列中所有记录的关键字都大于基准记录的关键字录的关键字第第9章内部排序章内部排序二、快速排序二、快速排序31第三节快速排序第三节快速排序n基准记录则排在这两个子序列中间基准记录则排在这两个子序列中间( (这也是该这也是该记录最终应安放的位置记录最终应安放的位置) )。n然后分别对这两个子
16、序列重复施行上述方法,然后分别对这两个子序列重复施行上述方法,直到所有的记录都排在相应位置上为止。直到所有的记录都排在相应位置上为止。n基准记录也称为枢轴(或支点)记录。基准记录也称为枢轴(或支点)记录。第第9章内部排序章内部排序二、快速排序二、快速排序( (算法算法) )32第三节快速排序第三节快速排序n取序列第一个记录为枢轴记录,其关键字为取序列第一个记录为枢轴记录,其关键字为PivotkeyPivotkeyn指针指针lowlow指向序列第一个记录位置指向序列第一个记录位置n指针指针highhigh指向序列最后一个记录位置指向序列最后一个记录位置第第9章内部排序章内部排序二、快速排序二、快
17、速排序( (算法算法) )33第三节快速排序第三节快速排序n一趟排序一趟排序( (某个子序列某个子序列) )过程过程1.1.从从highhigh指向的记录开始指向的记录开始, ,向前找到第一个关键字的值向前找到第一个关键字的值小于小于PivotkeyPivotkey的记录的记录, ,将其放到将其放到lowlow指向的位指向的位置置, ,low+1low+12.2.从从lowlow指向的记录开始指向的记录开始, ,向后找到第一个关键字的值向后找到第一个关键字的值大于大于PivotkeyPivotkey的记录的记录, ,将其放到将其放到highhigh指向的位指向的位置置, ,high-1high
18、-13.3.重复重复1,21,2,直到,直到low=highlow=high,将枢轴记录放在将枢轴记录放在low(high)low(high)指向的位置指向的位置第第9章内部排序章内部排序二、快速排序二、快速排序( (算法算法) )34第三节快速排序第三节快速排序n对枢轴记录前后两个子序列执行相同的操作,对枢轴记录前后两个子序列执行相同的操作,直到每个子序列都只有一个记录为止直到每个子序列都只有一个记录为止第第9章内部排序章内部排序一、快速排序一、快速排序( (算法实现算法实现) )35第二节快速排序第二节快速排序第第9章内部排序章内部排序void void QuickSortQuickSor
19、t ( (intint r ; r ;intint b;intb;int m ) m ) / / 假设关键字为整型,放在向量假设关键字为整型,放在向量rr中中 intint low=b, high=m, temp=r1; low=b, high=m, temp=r1; while ( lowhigh) while ( lowtemp) high=high-1; while(rhightemp) high=high-1; rlow rlow-rhigh-rhigh; while(rlowtemp) low=low+1; while(rlow-rhigh;rhigh; rlow=rhigh=tem
20、p; rlow=rhigh=temp; QuickSortQuickSort(r,1,high-1);(r,1,high-1); QuickSortQuickSort(r,high+1,m);(r,high+1,m); 二、快速排序二、快速排序( (举例举例) )36第三节快速排序第三节快速排序第第9章内部排序章内部排序初始关键字初始关键字pivotkey一次交换一次交换二次交换二次交换三次交换三次交换high-1完成一趟排序完成一趟排序lowhighlowlowlowlowlowhighhighhighhighhigh二、快速排序二、快速排序( (举例举例) )37第三节快速排序第三节快速排
21、序第第9章内部排序章内部排序完成一趟排序完成一趟排序分别进行快速排序分别进行快速排序有序序列有序序列二、快速排序二、快速排序( (性能分析性能分析) )38第三节快速排序第三节快速排序n快速排序是一个递归过程快速排序是一个递归过程, , 其递归树如图所示其递归树如图所示第第9章内部排序章内部排序n利用序列第一个记录作为利用序列第一个记录作为基准,将整个序列划分为基准,将整个序列划分为左右两个子序列。只要是左右两个子序列。只要是关键字小于基准记录关键关键字小于基准记录关键字的记录都移到序列左侧字的记录都移到序列左侧二、快速排序二、快速排序( (性能分析性能分析) )39第三节快速排序第三节快速排
22、序n快速排序的趟数取决于递归树的高度。快速排序的趟数取决于递归树的高度。n如果每次划分对一个记录定位后如果每次划分对一个记录定位后, , 该记录的左该记录的左侧子序列与右侧子序列的长度相同侧子序列与右侧子序列的长度相同, , 则下一步则下一步将是对两个长度减半的子序列进行排序将是对两个长度减半的子序列进行排序, , 这是这是最理想的情况。最理想的情况。第第9章内部排序章内部排序二、快速排序二、快速排序( (性能分析性能分析) )40第三节快速排序第三节快速排序n在在 n n个元素的序列中个元素的序列中, ,对一个记录定位所需时对一个记录定位所需时间为间为 O(n)O(n)。若设若设 t(n)
23、t(n) 是对是对 n n 个元素的序列个元素的序列进行排序所需的时间进行排序所需的时间, , 而且每次对一个记录正而且每次对一个记录正确定位后确定位后, , 正好把序列划分为长度相等的两个正好把序列划分为长度相等的两个子序列子序列, , 此时此时, , 总的计算时间为:总的计算时间为:T(n) cn + 2T(n/2 ) / c 是一个常数是一个常数 cn + 2 ( cn/2 + 2T(n/4) ) = 2cn + 4T(n/4) 2cn + 4 ( cn/4 +2T(n/8) ) = 3cn + 8T(n/8) cn log2n + nT(1) = O(n log2n )第第9章内部排序
24、章内部排序二、快速排序二、快速排序( (性能分析性能分析) )41第三节快速排序第三节快速排序n可以证明可以证明, , 快速排序的平均计算时间也是快速排序的平均计算时间也是O(nlogO(nlog2 2n)n)。n实验结果表明实验结果表明: : 就平均计算时间而言就平均计算时间而言, , 快速排快速排序是所有内排序方法中最好的一个。序是所有内排序方法中最好的一个。n但快速排序是一种不稳定的排序方法但快速排序是一种不稳定的排序方法第第9章内部排序章内部排序二、快速排序二、快速排序( (性能分析性能分析) )42第三节快速排序第三节快速排序n在最坏情况下在最坏情况下, , 即待排序记录序列已经按其
展开阅读全文