《数据结构与算法》第九章排序.优秀PPT.ppt
《《数据结构与算法》第九章排序.优秀PPT.ppt》由会员分享,可在线阅读,更多相关《《数据结构与算法》第九章排序.优秀PPT.ppt(71页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Chapter 9Sorting1、插入排序(干脆插入排序、希尔排序)、插入排序(干脆插入排序、希尔排序)2、交换排序(起泡排序、快速排序)、交换排序(起泡排序、快速排序)3、选择排序(简洁选择排序、堆排序)、选择排序(简洁选择排序、堆排序)4、归并排序、基数排序、归并排序、基数排序排序:将数据元素的一个随意序列,重新排列成一排序:将数据元素的一个随意序列,重新排列成一 个按关键字有序的序列。个按关键字有序的序列。9.1 概述概述 假设含假设含 n 个记录的序列为个记录的序列为 R1,R2,Rn,其相,其相应的关键字序列为应的关键字序列为 K1,K2,Kn 这些关键字相互之间可以进行比较,即在
2、它们之间这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系存在着这样一个关系:Kp1Kp2Kpn 按此固有关系将上式记录序列重新排列为按此固有关系将上式记录序列重新排列为 Rp1,Rp2,Rpn 的操作称作的操作称作排序排序排序排序。例:将关键字序列:例:将关键字序列:52 49 80 36 14 58 61 23 调整为:调整为:14 23 36 49 52 58 61 80 设设 Ki=Kj(1in,1jn,ij),且在排序前的,且在排序前的序列中序列中 Ri 领先于领先于 Rj(即(即 i j)。若在排序后的序列)。若在排序后的序列中中 Ri 仍领先于仍领先于 Rj,则称所用
3、的,则称所用的排序方法是稳定的排序方法是稳定的;反之,则称所用的反之,则称所用的排序方法是不稳定的排序方法是不稳定的。设排序前的关键字序列为:设排序前的关键字序列为:52,49,80,36,14,58,3636,23 若排序后的关键字序列为:若排序后的关键字序列为:14,23,36,3636,49,52,58,80,则则排序方法是稳定的排序方法是稳定的排序方法是稳定的排序方法是稳定的。若排序后的关键字序列为:若排序后的关键字序列为:14,23,3636,36,49,52,58,80,则则排序方法是不稳定的排序方法是不稳定的排序方法是不稳定的排序方法是不稳定的。内部排序和外部排序内部排序和外部排
4、序 若整个排序过程不须要访问外存便能完成,则称若整个排序过程不须要访问外存便能完成,则称此类排序问题为内部排序;此类排序问题为内部排序;反之,若参与排序的记录数量很大,整个序列的反之,若参与排序的记录数量很大,整个序列的排序过程不行能在内存中完成,则称此类排序问题为排序过程不行能在内存中完成,则称此类排序问题为外部排序。外部排序。内部排序的方法内部排序的方法 逐步扩大记录的有序序列的过程逐步扩大记录的有序序列的过程 有序序列区有序序列区无无 序序 序序 列列 区区有序序列区有序序列区无无 序序 序序 列列 区区经过一趟排序经过一趟排序 9.2 插入排序插入排序 有序序列有序序列 R1.i-1
5、Ri无序序列无序序列 Ri.n有序序列有序序列 R1.i无序序列无序序列 Ri+1.n实现实现“一趟插入排序一趟插入排序”可分可分三步三步进行:进行:3将将 Ri 插入(复制)到插入(复制)到 R j+1 的位置上。的位置上。2将将 R j+1.i-1 中的全部记录均后移一个位置;中的全部记录均后移一个位置;1在在 R1.i-1 中查找中查找 Ri 的插入位置,的插入位置,R1.j.key Ri.key R j+1.i-1.key;一趟干脆插入排序的基本思路一趟干脆插入排序的基本思路9.2.1 干脆插入排序干脆插入排序 初始状态初始状态4938659776132749 R0 R1 R2 R3
6、R4 R5 R6 R7i=1 i=2 3849659776132749i=3 3849659776132749i=4 3849657697132749i=5 3849657697132749i=6 3849657697132749i=7 384965769713274949386597761327494938 排序过程:先将序列中第排序过程:先将序列中第 1 个记录看成是一个有序子序列,个记录看成是一个有序子序列,然后从第然后从第 2 个记录起先,逐个进行插入,直至整个序列有序。个记录起先,逐个进行插入,直至整个序列有序。插入排序举例:插入排序举例:21 25 49 25*16 08 21 2
7、5 49 25*16 08 21 25 49 25*16 08 21 25 25*49 16 08 16 21 25 25*49 08 08 16 21 25 25*49 templatevoid Insert(ElemTypeelem,int n)/在数组在数组elem中作插入排序中作插入排序 for(int i=1;i0&elemj.key elemj-1.key;j-)/将比将比elemj大的元素交换到后面大的元素交换到后面 Swap (elemj,elemj-1);当当elemj比它前面元素的关键字小时,就向前移动,比它前面元素的关键字小时,就向前移动,直到遇到一个关键字比它大或相等的
8、为止直到遇到一个关键字比它大或相等的为止T(n)=O(n)算法评价算法评价 时间困难度:时间困难度:比较次数:比较次数:最好的状况:待排序记录按关键字从小到大排列(正序)最好的状况:待排序记录按关键字从小到大排列(正序)比较次数:比较次数:最坏的状况:待排序记录按关键字从大到小排列(逆序)最坏的状况:待排序记录按关键字从大到小排列(逆序)一般状况:待排序记录是随机的,取平均值。一般状况:待排序记录是随机的,取平均值。干脆插入排序是稳定排序干脆插入排序是稳定排序 9.2.2 希尔排序(缩小增量排序)希尔排序(缩小增量排序)思路:思路:对待排序列先对待排序列先“宏观宏观”调整,再调整,再“微观微观
9、”调整。调整。排序过程:先取一个正整数排序过程:先取一个正整数 d1 n,把全部相隔,把全部相隔 d1 的记录放在一组内,组内进行干脆插入排序;然后取的记录放在一组内,组内进行干脆插入排序;然后取 d2 0;i-)for(int j=0;jelemj+1.key)elem j elem j+1 9.4 交换排序交换排序 1、冒泡排序、冒泡排序 v 排序过程排序过程 初初 始始 关关 键键 字字 49 38 65 97 76 13 27 49 第第 一一 趟趟 排排 序序 38 49 76 97 13 97 27 97 49 9797 38 49 65 76 13 27 49 979738 49
10、 65 13 27 49 76 76 第第 二二 趟趟 排排 序序 38 49 13 27 49 65 65 第第 三三 趟趟 排排 序序 38 13 27 49 4949 第第 四四 趟趟 排排 序序 13 27 3849 49 第第 五五 趟趟 排排 序序 13 13 2727 38 38 第第 六六 趟趟 排排 序序 时间困难度时间困难度时间困难度时间困难度T(n)=O(n2)T(n)=O(n2)13 13 27 27 第第 七七 趟趟 排排 序序 冒泡排序的时间性能分析冒泡排序的时间性能分析正序正序比较次数:比较次数:时间困难度为时间困难度为O(n)反序反序比较次数:比较次数:时间困难
11、度为时间困难度为O(n2)2 2)1 1(1 1-=n nn n(n n-i i)n n-1-1i i54321123452 2)1 1(1 1-=n nn n(n n-i i)n n-1-1i i一般取第一个记录一般取第一个记录 基本思想:基本思想:任选任选任选任选一个记录,以它的关键字作为一个记录,以它的关键字作为“枢枢枢枢轴轴轴轴”,凡关键字小于枢轴的记录均移至枢轴之前,凡,凡关键字小于枢轴的记录均移至枢轴之前,凡关键字大于枢轴的记录均移至枢轴之后。关键字大于枢轴的记录均移至枢轴之后。2、一趟快速排序(一次划分)、一趟快速排序(一次划分)lowhigh设设 Rs=52 为枢轴。为枢轴。例
12、:例:52 52 52 49 80 36 14 58 61 97 23 75 high23 low low80highhighhighhigh14lowlow5252课本课本270页页 3、快速排序、快速排序 首先对无序的记录序列进行首先对无序的记录序列进行“一次划分一次划分”,之后分别对,之后分别对分割所得两个子序列分割所得两个子序列“递归递归”进行一趟快速排序。进行一趟快速排序。无无 序序 的的 记记 录录 序序 列列无序记录子序列无序记录子序列(1)无序子序列无序子序列(2)枢轴枢轴 一次划分一次划分 分别进行一趟快速排序分别进行一趟快速排序 有有 序序 的的 记记 录录 序序 列列 1
13、313656527275050383849495555ji13133838656527275050494955551313656527275050494938385555jjiiijijjj如何实现一次划分?如何实现一次划分?解决方法:解决方法:对分割得到的两个子序列递归地执行快速排序。对分割得到的两个子序列递归地执行快速排序。13132727383865655050494955551313272750503838494955556565ijij如何处理分割得到的两个待排序子序列?如何处理分割得到的两个待排序子序列?void QSort(elem,int low,int high)/对依次表对
14、依次表 L 中的子序列中的子序列 L.rlow.high 进行快速排序进行快速排序 if(low high)/长度大于长度大于1 /QSortint pivotloc=Partition(elem,low,high);int pivotloc=Partition(elem,low,high);/对对对对 L.rlow.high L.rlow.high 进行一次划分进行一次划分进行一次划分进行一次划分 QSort(elem,low,pivotloc-1);/对低子序列递归排序,对低子序列递归排序,pivotloc 是枢轴位置是枢轴位置 QSort(elem,pivotloc+1,high);/对
15、高子序列递归排序对高子序列递归排序 第一次调用函数第一次调用函数 Qsort 时,待排序记录序列的上时,待排序记录序列的上下界分别为下界分别为 0 和和 n-1。void QuickSort(elem,int n)/对依次表进行快速排序对依次表进行快速排序 QSort(elem,0,n-1);/QuickSort 快速排序的时间分析快速排序的时间分析 若待排序列中记录的关键字是随机分布的,则若待排序列中记录的关键字是随机分布的,则 k 取取 1 至至 n 中任一值的可能性相同。中任一值的可能性相同。由此可得快速排序所需时间的平均值为:由此可得快速排序所需时间的平均值为:结论:快速排序的时间困难
16、度为结论:快速排序的时间困难度为结论:快速排序的时间困难度为结论:快速排序的时间困难度为 O(n log n)O(n log n)。一次划分所需时间和表长成正比一次划分所需时间和表长成正比 到目前为止快速排序是到目前为止快速排序是平均速度最大平均速度最大平均速度最大平均速度最大的一种排序方法。的一种排序方法。(1)21 25 49 25*16 08 练习练习快速排序是一种不稳定的排序方法。快速排序是一种不稳定的排序方法。请举例说明。请举例说明。9.5 选择排序选择排序 9.5.1 简洁选择排序简洁选择排序 首先通过首先通过 n 1 n 1 次关键字比较,从次关键字比较,从 n n 个记录中找个
17、记录中找出关键字最小的记录,将它与第一个记录交换。出关键字最小的记录,将它与第一个记录交换。再通过再通过 n 2 n 2 次比较,从剩余的次比较,从剩余的 n 1 n 1 个记录中个记录中找出关键字次小的记录,将它与其次个记录交换。找出关键字次小的记录,将它与其次个记录交换。重复上述操作,共进行重复上述操作,共进行 n 1 n 1 趟排序后,排序结趟排序后,排序结束。束。例例 一趟一趟:13 38 65 97 76 49 27 i=0 二趟二趟:13 27 65 97 76 49 38 三趟三趟:13 27 38 97 76 49 65 四趟四趟:13 27 38 49 76 97 65 五趟
18、五趟:13 27 38 49 65 97 76 六趟六趟:13 27 38 49 65 76 97 i=4 i=1 i=2 i=3 n-1 n-2 n-6 初始初始:49 38 65 97 76 13 27 jjjjjjk13 49 kki=5 排序结束排序结束比较次数比较次数 for(j=i+1;j n;j+)if(elemj.key elemk.key)k=j;elemielemk;/与第与第 i 个记录交换个记录交换void SelectSort(ElemType elem,int n)/SelectSort 比较次数:比较次数:时间困难度:时间困难度:时间困难度:时间困难度:O(n2)
19、O(n2)for(i=0;i n-1;+i)int k=i;(1)21 25 49 25*16 08 练习练习 简洁选择排序是一种不稳定的排简洁选择排序是一种不稳定的排序方法。序方法。请举例说明。请举例说明。9.5.2 堆排序堆排序 堆排序是选择排序的改进(堆排序是选择排序的改进(1964提出)。提出)。在排序过程中,将在排序过程中,将r1到到rn看成是一个看成是一个完全二叉树依次存储结构,利用完全二叉完全二叉树依次存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系树中双亲结点和孩子结点之间的内在关系来选择最小或最大元素。来选择最小或最大元素。堆的定义:堆的定义:n个数据序列个数据序列
20、K1,k2,.,Kn称为堆,当称为堆,当且仅当该序列满足特性:且仅当该序列满足特性:此种状况称为小顶堆。或者,均大于也可以。此种状况称为小顶堆。或者,均大于也可以。此种状况状况称为大顶堆。此种状况状况称为大顶堆。从堆的定义可以看出,堆实质上是满足如下从堆的定义可以看出,堆实质上是满足如下性质的二叉树:树中任一非叶子结点的值均小于性质的二叉树:树中任一非叶子结点的值均小于等于它的孩子结点的值。或者,树中任一非叶子等于它的孩子结点的值。或者,树中任一非叶子结点的值均大于等于它的孩子结点的值。结点的值均大于等于它的孩子结点的值。)2/1(ni 例例(96,83,27,38,11,09)(13,38,
21、27,49,76,65,49,97)9627091138831327384965764997全部非终端结点的值均不大全部非终端结点的值均不大(小小)于其左右孩子结点的值。于其左右孩子结点的值。堆顶元素必为序列中堆顶元素必为序列中 n 个元素的最小值或最大值。个元素的最小值或最大值。小顶堆小顶堆 大顶堆大顶堆 堆排序:堆排序:堆排序需解决的两个问题:堆排序需解决的两个问题:1、如何由一个无序序列建成一个堆?、如何由一个无序序列建成一个堆?2、在输出堆顶元素后,如何将剩余元素调整为一个新的堆?、在输出堆顶元素后,如何将剩余元素调整为一个新的堆?将无序序列建成一个堆,得到关键字最小(大)的将无序序列
22、建成一个堆,得到关键字最小(大)的将无序序列建成一个堆,得到关键字最小(大)的将无序序列建成一个堆,得到关键字最小(大)的 记录;输出堆顶的最小(大)值后,将剩余的记录;输出堆顶的最小(大)值后,将剩余的记录;输出堆顶的最小(大)值后,将剩余的记录;输出堆顶的最小(大)值后,将剩余的 n-1 n-1 个元个元个元个元 素重又建成一个堆,则可得到素重又建成一个堆,则可得到素重又建成一个堆,则可得到素重又建成一个堆,则可得到 n n 个元素的次小值;如此个元素的次小值;如此个元素的次小值;如此个元素的次小值;如此 重复执行,直到堆中只有一个记录为止,每个记录出堆重复执行,直到堆中只有一个记录为止,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构与算法 数据结构 算法 第九 排序 优秀 PPT
限制150内