第10章排序.ppt_第1页
第10章排序.ppt_第2页
第10章排序.ppt_第3页
第10章排序.ppt_第4页
第10章排序.ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构 第10章排序 第10章排序 排序的定义和各种排序方法的特点 排序方法 稳定 或 不稳定 的含义各种排序方法的原理 排序过程 时间复杂度的分析和实现算法各种内排序方法的比较希尔排序 快速排序 堆排序和归并排序等高效排序方法是本章难点 本章内容 10 2插入排序 10 3交换排序 10 4选择排序 10 5归并和基数排序 10 1排序的基本概念 10 6各种内排序方法的比较 排序 将一组杂乱无章的记录按一定的规律顺次排列起来 关键字 key 通常数据记录有多个属性域 即多个数据成员组成 其中有一个属性域可用来区分记录 作为排序依据 该域即为关键字 10 1排序定义及相关概念 主关键字 如果在待排序记录序列中各个记录的关键字互不相同 这种关键字即主关键字 按照主关键字进行排序 排序的结果是唯一的 次关键字 待排序记录序列中有些记录的关键字可能相同 这种关键字称为次关键字 按照次关键字进行排序 排序的结果可能不唯一 10 1排序定义及相关概念 排序算法的稳定性 如果在记录序列中有两个记录R i 和R j 它们的关键字k i k j 且在排序之前 记录R i 排在R j 前面 如果在排序之后 记录R i 仍在记录R j 的前面 则称这个排序方法是稳定的 否则称这个排序方法是不稳定的 10 1排序定义及相关概念 内排序与外排序 内排序是指在排序期间数据记录全部存放在内存的排序 外排序是指在排序期间全部记录个数太多 不能同时存放在内存 必须根据排序过程的要求 不断在内 外存之间移动的排序 10 1排序定义及相关概念 内排序按排序思想的不同 分为插入排序 交换排序 选择排序 归并排序和基数排序等五类 内排序按所需的工作量的不同 分为简单排序 时间复杂度为o n2 先进排序 时间复杂度为o log2n 和基数排序 时间复杂度为o d n 10 1排序定义及相关概念 排序的时间开销 排序的时间开销是衡量算法好坏的最重要的标志 排序的时间开销可用算法执行中的记录比较次数与记录移动次数来衡量 算法运行时间代价的大略估算一般都按平均情况进行估算 对于那些受记录关键字序列初始排列及记录个数影响较大的 需要按最好情况和最坏情况进行估算 算法执行时所需的附加存储 评价算法好坏的另一标准 10 1排序定义及相关概念 待排序记录的存储方式 顺序存储 以一维数组作为存储结构 排序时必须实际移动记录 链式存储 以链表 动态链表或静态链表 作为存储结构 排序时不用物理移动记录 只需修改指针 静态链表 有的排序方法难于在链表上实现 且需要避免排序过程中的记录移动 10 1排序定义及相关概念 待排序记录的顺序存储类型定义 defineMAXSIZE20typedefintKeyType typedefstruct KeyTypekey 关键码 DataType typedefstruct DataTypedata MAXSIZE 1 0号单元空闲intlength SqList 10 1排序定义及相关概念 本章内容 10 2插入排序 10 3选择排序 10 4交换排序 10 5归并和基数排序 10 1排序的基本概念 10 6各种内排序方法的比较 10 2插入排序 插入排序 InsertSorting 基本思想 每步将一个待排序的记录 按其关键字大小 插入到前面已经排好序的一组记录的适当位置上 直到记录全部插入为止 10 2插入排序 10 2 1直接插入排序10 2 2折半插入排序10 2 3希尔排序 直接插入排序的基本思想 当插入第i i 1 个记录时 前面的R 1 R 2 R i 1 已经排好序 这时 用R i 的关键字与R i 1 R i 2 的关键字顺序进行比较 找到插入位置即将R i 插入 原来位置上的记录向后顺移 例 10 2 1直接插入排序 各趟排序结果 21 25 49 25 16 08 123456 21 25 49 25 16 08 123456temp i 4 25 21 25 49 25 16 08 123456 i 5时的排序过程 完成 25 16 21 25 49 25 08 123456 16 i 5j 2 对顺序表直接插入排序的算法 voidInsertSort SqList 插入到正确位置 10 2 1直接插入排序 性能分析最好情况是原始记录已按关键字递增有序排列 整个排序过程的比较次数为n 1次 时间复杂度为O n 最坏情况是原始记录按关键字递减有序排列 整个排序过程的比较次数为 n 2 n 1 2 记录移动的次数为 n 4 n 1 2 时间复杂度是O n2 平均情况下 关键字比较次数和记录移动次数约为n2 4 时间复杂度是O n2 10 2 1直接插入排序 性能分析关键字比较次数和记录移动次数与记录关键字的初始排列有关 从空间看 直接插入排序算法只需一个记录的辅助空间 空间复杂度为O 1 直接插入排序是一种稳定的排序方法 10 2插入排序 10 2 1直接插入排序10 2 2折半插入排序10 2 3希尔排序 基本思想设在顺序表中有一个记录序列R 1 R 2 R n 其中 R 1 R 2 R i 1 是已经排好序的记录 在插入R i 时 利用折半查找法寻找R i 的插入位置 排序过程 10 2 2折半插入排序 10 2 2折半插入排序 voidBInsertSort SqList 插入 9 2 2折半插入排序 voidBInsertSort SqList 插入 low 1 high i 1 while low high 1 j L data j 1 L data j 记录后移L data high 1 L data 0 插入 10 2 2折半插入排序 性能分析插入第i个记录时 需要经过 log2i 1次关键字比较 才能确定它应插入的位置 将n个记录用折半插入排序所进行的关键字比较次数为O nlog2n 折半插入排序所需要的关键字比较次数与待排序记录序列的初始排列无关 折半插入排序的记录移动次数与直接插入排序相同 依赖于记录的初始排列 10 2 2折半插入排序 性能分析折半插入排序的时间复杂度仍为O n2 从空间看 空间复杂度为O 1 折半插入排序是一种稳定的排序方法 10 2插入排序 10 2 1直接插入排序10 2 2折半插入排序10 2 3希尔排序 10 2 3希尔排序 从对直接插入排序的分析可知 其时间复杂度为O n2 但是当待排序记录处于 基本有序 状态或当n值较小时 直接插入排序的效率可大大提高 Shell排序方法正是基于这两点考虑对直接插入排序加以改进而提出的一种插入排序算法 10 2 3希尔排序 Shell排序的基本思想先确定一个小于n的整数d1作为第一个增量 把记录序列分为d1个组 所有距离为d1倍数的记录放在同一个组中 在各组内进行直接插入排序 然后 取第二个增量d2 d2 d1 重复上述分组和排序 直至所取的增量dt 1 dt dt 1 d2 d1 即所有记录处在同一组中进行直接插入排序为止 21 25 49 25 16 08 123456 21 25 49 25 16 08 123456 21 25 49 25 16 08 012345 开始时增量值较大 子序列中的记录较少 排序速度较快 随着排序进展 增量值逐渐变小 子序列中记录个数逐渐变多 由于前面工作的基础 大多数记录已基本有序 所以排序速度仍然很快 增量的取法有多种 最初shell提出取d1 n 2 d2 d1 2 直到dt 1 knuth提出取di 1 di 3 1 还有人提出都取奇数为好 也有人提出各增量互质为好 10 2 3希尔排序 性能分析对特定的待排序记录序列 可以准确地估算关键字的比较次数和记录移动次数 但想要弄清关键字比较次数和记录移动次数与增量选择之间的依赖关系 并给出完整的数学分析 还没有人能够做到 Knuth利用大量的实验统计资料得出 当n很大时 关键字平均比较次数和记录平均移动次数大约在1 25n到1 6n的范围内 这是在利用直接插入排序作为子序列排序方法的情况下得到的 希尔排序是一种不稳定的排序方法 10 2 3希尔排序 本章内容 10 2插入排序 10 3交换排序 10 4选择排序 10 5归并和基数排序 10 1排序的基本概念 10 6各种内排序方法的比较 基本思想 是两两比较待排序记录的关键字 如果发生逆序 即排列顺序与排序后的次序正好相反 则交换之 直到所有记录都排好序为止 10 3交换排序 10 3交换排序 10 3 1冒泡排序10 3 2快速排序 基本方法 首先将第一条记录的关键字和第二条记录的关键字进行比较 若为逆序 则将两个记录交换 依次类推 直至第n 1条记录和第n条记录的关键字比较完为止 此过程称作一趟起泡排序 重复此过程 直到全部有序为止 整个过程中 关键字越大的记录越下沉到底 同时使关键字小的记录相对上浮 例 10 3 1冒泡排序 21 25 49 25 16 08 012345 21 25 i 1 49 25 16 25 16 08 49 noSwap 1 08 25 49 21 noSwap 1 i 2 i 3 08 16 noSwap 1 25 25 21 25 012345 i 4 49 16 noSwap 0 08 25 21 10 3 1冒泡排序 voidBubbleSort SqList 排序趟数与原始数据的排列情况有关 最好情况 在记录的初始排列已经按关键字从小到大排好序时 只执行一趟起泡 做n 1次关键字比较 不移动记录 最坏的情况 是算法执行了n 1趟起泡 第i趟 1 i n 做了n i次关键字比较 执行了n i次记录交换 10 3 1冒泡排序 10 3 1冒泡排序 排序趟数与原始数据的排列情况有关 最好情况 最坏的情况 总的关键字比较次数KCN和记录移动次数RMN为 排序趟数与原始数据的排列情况有关 起泡排序需要一个附加记录以实现记录值的对换 空间复杂度为O 1 起泡排序是一个稳定的排序方法 时间复杂度为O n2 10 3 1冒泡排序 10 3交换排序 10 3 1冒泡排序10 3 2快速排序 基本思想 任取待排序记录序列中的某个记录 例如取第一个记录 作为基准 按照该记录的关键字大小 将整个记录序列划分为左右两个子序列 左侧子序列中所有记录的关键字都小于或等于基准记录的关键字 右侧子序列中所有记录的关键字都大于或等于基准记录的关键字 10 3 2快速排序 基本思想 基准记录则排在这两个子序列中间 这也是该记录最终应安放的位置 然后分别对这两个子序列重复上述过程 直到所有的记录都排在相应位置上为止 例 10 3 2快速排序 21 25 49 25 16 08 123456 pivot 21 10 3 2快速排序 一趟划分算法 intPartition SqList 返回枢轴位置 voidQSort SqList 对高子表递归排序 10 3 2快速排序 算法QSort是一个递归的算法 可用递归树描述 例的递归树如下 10 3 2快速排序 算法QSort是一个递归的算法 可用递归树描述 快速排序的趟数取决于递归树的深度 快速排序是所讨论的所有内排序方法中最好的一个 在n个元素的序列中 对一个记录定位所需时间为O n n较大的平均情况而言 快速排序是 快速 的 但当n很小时 比其它简单排序方法还慢 10 3 2快速排序 最理想的情况 每次划分后左侧子序列与右侧子序列的长度相同 最坏的情况 待排序记录序列已经按其关键字从小到大排好序 其递归树成为单支树 解决方法 合理地选择基准记录 取每个待排序记录序列的第一个记录 最后一个记录和位置接近

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论