一、排序概念:
二、内部排序
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、【再:合并磁盘各个有序块】
再两两结合排序,只不过还是要两个归并段各取一块,来两块两块的进行排序


































































































