《考研408数据结构》第八章(排序)复习笔记

一、排序概念:

二、内部排序

1、【插入排序】

【插入排序:直接插入排序】

简易B站动画流程:(入门理解)

  • 细节流程:
    • 上面图不够细节,具体如何把i遍历到的每一位插入到【前面的有序子数组】里的步骤如下:
  • 代码思想:
    • 注意:一定要先保存【待插入数】,以免给插入位留空时元素后移会覆盖【待插入数】
      • 可以是【用A0作为哨兵位】,也可以【用一个临时遍历temp保存】
      • 可以发现【直接插入:是稳定排序算法】
        • 当【待插入数】比【前面已有序序列最后一位】一样大时,也不用移动数组,直接把他包含进【已有序序列】即可,这样【这两个相同的数位置没变】
  • 【最好最坏情况】

【插入排序:折半插入法排序】

【插入排序:希尔排序】

  • 将【间隔为n的元素】当作【一个子数组】,一个数组有多个这样的子数组
  • 对【这些子数组】分别进行【直接插入排序】(下图中,同颜色的元素都排成升序)
  • 然后不断把间隔n缩小,直到【间隔n=1】,也就是在基本有序的基础上,每两个元素比较,最终整体完整有序
  • 注意:希尔排序是不稳定排序算法

2、【冒泡排序】

  • 只要题目里你看到【每一趟】排序后,a0~ai区间最大的数都跑到ai(这一轮比较区间的最后面),那就一定是冒泡排序,冒泡排序就是每一趟都把最大的数往后排
    • 注意【每一轮】和【每一趟】:
      • 【每一趟】排序:是外层大循环,要比较的区间是从0\~n-1、0\~n-2、0\~n-3......0\~1 (图片中右边黄色图)
      • 【每一轮】排序:是内层小循环,比如在0\~n-1区间内两两比较,最后把最大数排到an-1 (图片中左边绿色图)

3、【快速排序】

具体【一趟(一次)排序】的过程:

【整体N趟(N次)排序】过程:和折半查找二叉树BST一致

4、【选择排序】

4、【堆排序(全世界最难的排序)】

堆的插入和删除不解释了,直接看例子

【插入】:

按照给出的乱序数列,从上到下、从左到右地建成一个完全二叉树

调整大根堆是【从下往上】,看每一个子树是否满足大根堆【父节点比下面孩子节点大】

如果不是,就比较孩子,选【最大孩子】和【父节点交换】

【删除】

和插入相反,删除元素后【从上往下】,看每一个子树是否满足小根堆【父节点比下面孩子节点小】

如果不是,就比较孩子,选【最小孩子】和【父节点交换】

6、【计数排序(世界上最简单的排序)】

7、【基数排序】

比较的是序列每个数的【每1位:个、十、百、千、万.....】

可以按【最高位开始】也可以按【最低为开始】,但是【最高位】麻烦我们不学

  • 【存储结构】
    • 适合【链式存储】!!
      • 【链式存储】第i位相同的数可以统一挂在一条队列上,并按队列先进先出的原理,经过各个位排序后自然实现整体数字有序,又节省空间
    • 而不适合【顺序存储】
      • 因为【n个序列数】可能有【n个某一位都一样的情况(例如:11 、21、31、41 、51、61 .....个位数都是1)】
      • 而且每一位都有【0~9】10种可能
      • 所以顺序存储要用一个【n×10的二维数组】,空间复杂度过大!!!不适合!!!

【按位相同的数排序】

首先将位相同的元素统一挂到一个【位队列】,从队尾插入,排序时从对头接上

【上述操作从低位到高位排序:个\十\百\千\万....】

8、【归并排序】

10、【超级重要!!!最重要的总结!!!】

真题100%选择必考多个算法的特点比较!!必须汇总!!

实在记不住谁和【初始状态有关】时就举例子:

1、当数组完全有序时;2、当数组完全逆序时; 3、快速排序数组第1个枢轴是最小/最大值

三、外部排序(利用【归并排序】)

磁盘与内存之间以【块】为传输单位,一个内存无法装入所有的块,而外存的各个块要排好序必须放内存排,那么只能【每次分几块进内存,排好序后再一点点返回外存磁盘】

1、【先:块排序(生成初始归并段)】

任务是把外存磁盘【每一个块】内部先排成【有序块】

2、【再:合并磁盘各个有序块】

再两两结合排序,只不过还是要两个归并段各取一块,来两块两块的进行排序

【第一趟】

【第二趟】

【第三趟】

3、优化方法

1)多路归并

2)减少初始归并段数量

相关推荐
Rabitebla13 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
坤坤子吖17 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
YLCHUP21 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
旖旎夜光1 天前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
nice_lcj5201 天前
LRU 缓存入门:它是什么、怎么用、面试怎么手写
java·数据结构·缓存·面试·lru
꧁细听勿语情꧂1 天前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
星恒随风1 天前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
2603_969694852 天前
【JavaWeb学习记录】MyBatis核心知识点与实战笔记:从入门到动态SQL
笔记·sql·学习·mysql·mybatis·javaweb·学习方法
Pniubi2 天前
关于算法用现成数据结构和手撕
数据结构