一、希尔排序
(一)核心概念
希尔排序(Shell Sort)由 D. L. Shell 在 1959 年提出,作为插入排序的改进版本,又称 “缩小增量排序”(Diminishing Increment Sort) ,属于非稳定排序算法。其核心是通过将待排序记录序列分割成若干子序列,对每个子序列进行直接插入排序,随着增量逐渐减小,子序列包含元素增多,当增量减至 1 时,对整个序列进行最终插入排序,此时序列基本有序,插入排序效率提升 。
(二)原理步骤
选择增量序列:常见如初始设置增量 gap 为数组长度的一半,后续每次将 gap 除以 2,直到 gap 为 1。也有其他公式,像 h (1)=1,h (i)=3 * h (i - 1)+1(h (k)
分组排序:按选定增量将数组元素分组,例如初始数组 [9,1,2,5,7,4,8,6,3,5],若 gap 为 5,分成 5 组:[9,4]、[1,8]、[2,6]、[5,3]、[7,5],对每组内元素进行插入排序。
缩小增量重复:完成一轮分组排序后,缩小增量,重新分组再排序。如上述数组,当 gap 缩小为 2,重新分组后再进行插入排序。直到增量为 1,对整个数组进行最后一次插入排序,完成最终排序 。
(三)性能分析
时间复杂度:希尔排序时间复杂度与增量序列紧密相关。普遍认为平均时间复杂度为 O (n^1.3),相较于插入排序有大幅优化,尤其是处理大规模数据时优势明显。但当数组完全逆序时,时间复杂度会退化为 O (n^2) 。
空间复杂度:算法过程中仅使用原数组空间,未开辟额外空间,因此空间复杂度为 O (1) 。
稳定性:由于分组后进行多次插入排序,相同元素在不同分组插入排序过程中相对位置可能改变,所以希尔排序是不稳定的排序算法 。
(四)适用场景
适用于中等规模数据排序,当数据部分有序时,希尔排序能快速完成排序任务 。
二、归并排序
(一)核心概念
归并排序是典型的分治算法,其核心思想是将数组递归地分成两部分,分别对两部分进行排序,然后将排序后的两部分合并成一个有序数组 。
(二)原理步骤
分解:将待排序数组从中间分成两个子数组,持续递归分解,直至子数组长度为 1 或 0(此时子数组已有序)。如数组 [3,1,4,1,5,9,2,6],首次分解为 [3,1,4,1] 和 [5,9,2,6] 。
递归排序:对分解得到的子数组分别递归进行归并排序。如对 [3,1,4,1] 继续分解为 [3,1] 和 [4,1],再分别排序 。
合并:合并两个已排序子数组。创建临时数组,用两个指针分别指向两个子数组起始位置,比较指针指向元素,将较小元素放入临时数组并移动对应指针,直到一个子数组元素全部处理完,再将另一个子数组剩余元素直接复制到临时数组,最后将临时数组内容复制回原数组 。
(三)性能分析
时间复杂度:无论数组初始状态如何(最好、平均、最坏情况),归并排序时间复杂度均为 O (n log n)。因为每次分解将数组分成两半,分解层数为 log n,每层合并操作需遍历整个数组,时间复杂度为 O (n) 。
空间复杂度:合并过程中需创建与原数组大小相同的临时数组存储合并结果,所以空间复杂度为 O (n) 。
稳定性:归并排序是稳定排序算法,合并时相同元素相对顺序不会改变 。
(四)适用场景
适用于数据量大且对稳定性有要求的场景,如链表数据结构的排序,其合并操作在链表上效率很高 。



1854

被折叠的 条评论
为什么被折叠?



