内部排序——一文速通
一、理解内部排序的定义和各种排序算法基本思想及其特点
(1)内部排序的定义
内部排序 指的是待排序的所有记录(数据)都存放在计算机的内存中进行排序的过程。特点:数据量不能大于内存容量,适用于中小规模的数据集。
(2)各种排序算法基本思想及其特点
(1)插入类排序
直接插入排序
基本思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中直到全部记录插入完成。
特点:稳定、简单,适用于小规模或基本有序的数据。时间复杂度最好 O(n),平均 O(n²)。
希尔排序
基本思想:将整个序列分割成若干子序列(按增量分割),分别进行直接插入排序;然后逐步缩小增量,直至增量为1,对整个序列排序。
特点:不稳定,是插入排序的改进,适用于中等规模数据。
(2)交换类排序
冒泡排序
基本思想:重复比较相邻元素,如果逆序则交换,这样每一轮将最大(或最小)元素“浮”到顶端。
特点:稳定、简单,效率低,适合教学。
快速排序
基本思想:选取一个基准元素,通过一趟排序将序列分成两部分,左边都比基准小,右边都比基准大,然后递归对两部分排序。
特点:不稳定,平均性能很好 O(n log n),是常用排序算法。
(3)选择类排序
简单选择排序
基本思想:每次从待排序序列中选择最小(或最大)元素,放到已排序序列末尾。
特点:不稳定,交换次数少,但时间复杂度总是 O(n²)。
堆排序
基本思想:将序列构建成一个大顶堆(或小顶堆),然后每次取出堆顶元素(最大或最小),再调整堆,重复直到堆为空。
特点:不稳定,适合大规模数据,时间复杂度 O(n log n),且只需 O(1) 额外空间。
(4)归并类排序
归并排序
基本思想:将序列递归地分成两半,分别排序,然后将两个有序子序列合并成一个有序序列。
特点:稳定,时间复杂度 O(n log n),但需要 O(n) 额外空间。
(5)基数排序(分配类排序)
基本思想:按位排序,从最低位到最高位(或反之)依次进行稳定排序(如桶排序)。
特点:稳定,适合整数或字符串排序,时间复杂度 O(d*n),d 为位数。
二、掌握插入,希尔,快速,堆等方法的排序过程
直接插入排序过程(基于插入)
每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中直到全部记录插入完成。
折半插入排序过程(基于插入)
核心思路:先用折半查找找到应该插入的位置,再移动元素
希尔排序过程(基于插入)
冒泡排序过程(基于交换)
冒泡排序每趟就能确定一个元素的最终位置。
快速排序过程(基于交换)
快速排序每趟就能确定一个元素的最终位置。
简单选择排序(基于选择)
每一趟在待排序元素中选取关键字最小的元素加入有序子序列
堆排序(基于选择)
大根堆
小根堆
建立大根堆
先按层次遍历的顺序依据数组建立一个二叉树。从数组下标最大的数组元素对于的非结点开始把所有非叶结点都检查一遍,是否满足大根堆的要求,如果不满足,则将当前结点与更大的一个孩子互换。若元素互换破坏了下一级的堆,则采用相同的方法继续往下调整(小元素不断“下坠”)
具体过程看视频:(从05:08开始看,画起来太麻烦了)https://www.bilibili.com/video/BV1b7411N798?spm_id_from=333.788.videopod.sections&vd_source=af664767642e6eb0be84623726e5e7fe&p=96
基于大根堆进行排序
每一趟将堆顶元素加入有序子序列(与待排序序列中的最后一个元素交换)
具体过程看视频:(从14:38开始看,画起来太麻烦了)
https://www.bilibili.com/video/BV1b7411N798?spm_id_from=333.788.videopod.sections&vd_source=af664767642e6eb0be84623726e5e7fe&p=96
归并排序
把两个或多个已经有序的序列合并成一个有序序列
基数排序
三、理解各种内部排序算法的优缺点、各种排序算法的时间效率分析
记忆不稳定的算法口诀:简单希尔快速堆。除此之外的都是稳定的。
记忆每趟排序结束后,能确保有一个元素到达其最终位置的排序算法口诀:简单快速堆泡