第八章 排序

1. 排序分类:

插入排序:直接插入排序(基于顺序查找)、折半插入排序(基于折半查找)、希尔排序(基于逐趟缩小增量);

交换排序:冒泡排序、快速排序;

选择排序:简单选择排序、树形选择排序(锦标赛排序 )、堆排序;

归并排序:2-路归并排序;

基数排序(时间复杂度O( d×n),d=关键字的位数)。

2. 直接插入排序

大量的比较和移动

时间效率: 最好O(n);最坏O(n^2);平均O(n^2);

空间效率:O(1) ——因为仅占用1个缓冲单元

算法的稳定性:稳定

该算法简单、容易实现,适用于待排序记录基本有序或待排序记录较小时。

3. 折半插入排序

比较次数减少了,但移动次数没减少。

时间效率: 最好O(n);最坏O(n^2);平均O(n^2);

空间效率:O(1)

算法的稳定性:稳定

4. 希尔排序

基本思想:先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中记录“基本有序”时,再对全体记录进行一次直接插入排序。

技巧:子序列的构成不是简单地“逐段分割”;

将相隔某个增量dk的记录组成一个子序列;

让增量dk逐趟缩短(例如依次取5,3,1);

直到dk=1为止。

时间效率:平均约O(n^1.5);

空间效率:O(1)

算法的稳定性:不稳定

5. 练习:给定关键字序列(256,301,751,129,937,863,742,694,    076,438),分别写出利用直接插入排序和希尔排序(dk=5,3,1)进行排序的过程。

注意圈起来的这几个数的排序

6. 冒泡排序O(n^2):

时间复杂度:O(n²);

空间复杂度:O(1)

冒泡排序是稳定排序

7. 快速排序O( nlog2n )

基本思想:任取一个元素 (如第一个) 为中心;

所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表;

对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个

时间复杂度:O( nlog2n):就时间复杂度而言,快速排序是我们所讨论的所有内排序方法中最好的一个。

空间复杂度:O( log2n ):快速排序是递归的,需要有一个栈存放每层递归调用时参数(新的low和high)。

快速排序是不稳定排序

8. 简单选择排序:

基本思想:在一组元素中选择值最小的元素;

若它不是这组元素中的第一个元素,则将它与这组元素中的第一个元素交换。在剩下的元素中重复上述两步,直到剩余元素只有一个为止。

时间复杂度:O(n²)

空间复杂度:O(1)

简单选择排序是稳定排序

9. 锦标赛排序  (又称树形选择排序)

基本思想:与体育比赛时的淘汰赛类似。

首先对 n 个记录的关键字进行两两比较,得到 n/2 个优胜者(关键字小者),作为第一步比较的结果保留下来。然后在这 n/2 个较小者之间再进行两两比较,…,如此重复,直到选出最小关键字的记录为止。

优点:减少比较次数,加快排序速度

缺点:空间效率低(以空间换时间)

10. 堆排序

  • 堆可以用树的结构特征来描述,但堆实际上是存放在线性空间中的
  • 堆是一棵采用顺序存储结构的完全二叉树;
  • 基本思想:
  • 将序列r[1...n] 建成一个堆,交换r[1]和r[n],则r[n]为关键字最大的记录。
  • 将r[1...n-1]重新调整为堆,交换r[1]和r[n-1] ,则r[n-1]为关键字次大的记录。
  • 循环n-1次,直到交换了r[1]和r[2]为止,则得到了一个非递减的有序序列r[1...n]。

堆排序需解决的两个问题:

①如何由一个无序序列建成一个堆?

②如何在输出堆顶元素之后,调整剩余元素,使之成为一个新的堆?(大、小顶堆筛选)

有n 个结点的完全二叉树,最后一个分支结点的标号是n/2

时间复杂度:O( nlog2n)

空间复杂度:O(1)

堆排序是不稳定排序

11.  2-路归并排序

基本思想:设初始序列含有n个记录,则可看成n个有序的子序列,每个子序列长度为1;

两两合并,得到 n/2  个长度为2或1的有序子序列;

再两两合并,…如此重复,直至得到一个长度为n的有序序列为止。

时间复杂度:O( nlog2n)

空间复杂度:O(n) ,需要一个与原始序列同样大小的辅助数组

归并排序是稳定排序

12. 基数排序

不需要关键字之间的比较,是典型的分配类排序。

链式基数排序:

先决条件:知道各级关键字的主次关系;知道各级关键字的取值范围

基于最低位优先法思想,借助“分配”和“收集”对单逻辑关键字进行排序。

用链表作存储结构

时间复杂度:O(d(n+rd))空间复制度:O(n+rd)

基数排序是稳定排序

13. 简单排序一般只用于n值较小的情况;

归并排序适用于n值较大的情况;

基数排序适用于n值很大而关键字的位数d较小的序列;

快速排序是排序方法中最好的方法。

14. 为避免顺序存储时大量移动记录的时间开销,可考虑用链表作为存储结构:直接插入排序、归并排序、基数排序

15. 不宜用链表作为存储结构:折半插入排序、希尔排序、快速排序、堆排序

数据结构 严蔚敏 第八章 排序 期末复习总结相关推荐

  1. 数据结构概览之第八章排序

    前言:数据结构概览之第八章排序整理 插入排序 思想: 从待排关键字序列中的第二个关键字开始一直到最后的一个关键字结束,不论待排序的关键字是否有序,都要执行 len -1 次排序: 把当前的关键字cur ...

  2. 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...

    1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...

  3. 【计算机】数据结构-严蔚敏/清华大学P3

    [计算机]数据结构-严蔚敏/清华大学P1 第二章    线  性表 线性结构 是 一个数据元素的有序(次序)集 线性结构的基本特征: 1.  集合中必存在唯一的一个"第一元素": ...

  4. 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码

    数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...

  5. 数据结构 严蔚敏 第二章 线性表

    数据结构 严蔚敏 第二章 线性表 线性表:由n个(n>=0)数据特征相同的元素构成的有限序列. 线性表的类型定义表示和实现 顺序表 存储单元地址连续 随机存取 若每个元素占用 m 个存储单元,以 ...

  6. 数据结构严蔚敏清华大学pdf_2019年清华大学自动化系控制工程专业大数据方向考研经验分享...

    基本情况(以下内容仅代表个人观点) 我目前就读于西南某双非石油工程专业,2019考研报考清华大学自动化系大数据工程专业,一志愿复试被刷,侥幸调剂录取至微电子系.初试总分346分(政治-63 + 英语一 ...

  7. 【数据结构总结】第八章 排序

    第八章 排序 提示:本文主要是以思维导图的形式概括数据结构第一章的精华内容,基本不会用到文字性的内容,目的是为了给大家梳理每个重要的知识点的相关概念,方便大家在复盘的时候快速阅读和浏览,加快记忆速度, ...

  8. 数据结构----严蔚敏

    最近一直想找一本纯数据结构的书来学习,找来找去都没有找到一本合适的书籍,相比之下国内的书籍之中,严蔚敏和吴伟民的还算是经典版了,很多国内其他数据结构教材都参考这本书的.但缺点是很多都是伪代码,对编程初 ...

  9. 数据结构——查找最全总结(期末复习必备)

    目录 查找的基本概念 线性表的查找 顺序查找 折半查找(二分或对分查找) 分块查找(索引顺序查找) 树表的查找 二叉排序树 定义: 二叉排序树的查找: 二叉排序树的插入: 二叉排序树的创建: 二叉排序 ...

  10. 有关数据结构基础知识(数据结构 严蔚敏版)

    1. 数据结构是一门研究非数值计算程序设计中的操作对象 以及这些对象之间的关系和操作的学科 2. 研究包括逻辑结构和存储结构 1) 逻辑结构(从具体问题抽象出来的数学模型)分为 集合结构 线性结构 树 ...

最新文章

  1. 金融领域下的数据挖掘算法应用:AdaBoost模型摩天
  2. python中str是什么函数_python str函数怎么用
  3. CUDA out of memory. Tried to allocate 14763.13 GiB (GPU 3; 10.73 GiB total capacity; 165.28 MiB alre
  4. [转]深入理解Java之线程池
  5. Java声明字符串数组,架构师必备!
  6. 在centos上运行neural_artistic_style 风格转换
  7. 案例:回归分析-R实现
  8. 回答工作做好了,可能有三种情形
  9. 中小型城市商业银行数字化转型实践(一)整体技术架构转型(双态IT)
  10. 微信小程序之——实现一行滑动显示很多文字-scroll-view
  11. 收集的一些学习ios的好网站
  12. PyTorch 入门与实践(七)循环神经网络(RNN)
  13. Activity到底是什么时候显示到屏幕上的呢?
  14. 计算机网络知识点总结(计网期末盲押系列)
  15. 基于层次分析法的轴间预瞄和轴距预瞄俯仰半车LQR控制仿真分析(重型汽车)
  16. Hive案例之股票分析
  17. [Latex] 插入图片 | 插入表格 | 符号、文本粗体 | 单栏、双栏添加行号 | 添加空格 | 注释快捷键 | 维度 | 脚注 | 公式 | 分点 |
  18. 未来的直播网站源码可实现,CycleGAN,视频换脸?
  19. Java 枚举(enum) 7种常见的用法
  20. C语言学习第017课——C语言提高(一)

热门文章

  1. Roaring BitMap(高效压缩位图)
  2. CSDN博客排名前15名
  3. IOS开发之——硬件开发-距离传感器(02)
  4. keras中的K.gradients()函数
  5. ArcGIS Pro 创建tpk
  6. promise .then和async await的使用
  7. [譯 + 更新] 參透 Node 中 exports 的 7 種設計模式
  8. 从共享征信黑名单到建立白名单体系:LinkEye想打造基于区块链的征信联盟
  9. play商店 小米_小米应用商店和Google Play商店的简单对比
  10. 计算LTE 峰值速率