"递归法"之后,我们继续探索算法的奥秘。今天,慕寒将引领大家走进"基于比较的排序"的世界,重点介绍三种方法:插入排序、合并排序以及快排序。排序,这一看似简单的操作,实则蕴含着深奥的学问。在数据处理中,它扮演着至关重要的角色,能够使数据按照特定规则有序排列,从而为我们的分析和决策提供有力支持。
011.排序算法综述
插入排序通过逆序遍历数组,将每个元素插入到正确位置,实现有序排列。这种排序方式的基本思想是将一个元素插入到它所属的正确位置。具体来说,就是将数组中的某个元素与前面的元素逐一比较,找到它的合适位置并插入。这个过程需要逆序遍历数组,并与每个元素进行比较和移动,直至找到合适的位置。当然,在实际操作中还需要考虑一些特殊情况,比如数组中只有一个元素时的情况,以及新插入元素与前一个元素大小关系等。
合并和快排序都是基于分治策略的比较排序算法,各有独特的实现方法。接下来,我们还将探讨合并排序和快排序这两种方法。这两种排序算法同样基于比较的思想,但实现方式各有不同。合并排序通过递归分治的方式将大问题拆解为小问题,逐步合并解决;而快排序则利用了分区的思想,通过一个基准值将数组分为两部分,分别进行排序。这些算法各有千秋,在实际应用中可以根据需求选择适合的方法。
通过今天的介绍,希望大家能对"基于比较的排序"有更深入的了解,并能灵活运用这些算法解决实际问题。
022.插入排序的实现细节
2.1 ◆ 插入排序步骤
在插入排序中,插入排序步骤包括逆序比较及元素插入,需要处理数组特殊情形 。具体步骤为:首先,如果 self.oriList 已排序,则直接赋值给 self.sortedList。否则,我们需要初始化一个空列表 sortedList。然后,使用 for 循环遍历 self.oriList 中的每个元素,每次从 oriList 中取出一个元素并与 sortedList 中的元素逐一比较。若取出的元素小于 sortedList 中的所有元素,则将其直接添加到 sortedList 的开头。若取出的元素大于等于 sortedList 中的部分元素,则找到合适的位置插入该元素,以确保 sortedList 仍然保持有序。重复这些步骤,直到 oriList 中的所有元素都被处理完毕。
这一步骤涉及逆序遍历和元素插入,确保每个元素都能找到其正确的位置。

2.2 ◆ 算法复杂度分析
在算法复杂度分析中,插入排序在最佳情况下的复杂度为O(n) ,而在最坏情况下的复杂度为O(n²)。在最好情况下,比如当输入数组已经有序时,我们只需进行一次比较就能确定待插入元素的位置,而耗时主要在于插入后的元素位置调整。而在最坏情况下,即数组是逆向的,每个元素都需要与所有前边的元素进行比较,导致复杂度上升到O(n²)。
033.合并排序的实现细节
3.1 ◆ 分治策略概述
合并排序通过"递归法"或"分治法"实现,其基本思想是在每一步都将问题拆解为小问题,逐层解决后再逐步合并。这种方法能有效提高处理大型数据集时的效率,因为它充分利用了递归和分治的思想来优化排序过程。
3.2 ◆ 合并排序步骤
合并排序的步骤包括分解子数组及有序合并,实现数组的有序排列。具体来说,分解步骤中我们不断地将原始数组一分为二,直到子数组的长度为1。然后,在合并步骤中,我们将这些已排序的子数组逐步合并,以形成最终的有序数组。这种方法确保了从分解到合并的整个过程中,数组始终有序。