插入排序优化——超越归并排序的超级算法

在这里插入图片描述

插入排序算法

在了解如何改进插入排序之前,我们先要了解插入排序的基本算法:

算法讲解

插入排序对于少量元素的排序,是一个有效的算法 。

插入排序是一种简单的排序方法,它是将一个数据插入到已经排好序的有序数组,从而形成一个新的有序数组。

插入排序的工作方式像许多人排序扑克牌:

我们每次从桌子上拿走一张牌并将其插入到手中正确的位置。

为了找到它的正确位置,我们从右到左将它与手中的每张牌进行比较。

因此,手上的牌总是有序。

数据模拟

原本要排序的数为 5 3 4 2 9 1,从小到大排序。


3 5 4 2 9 1        
### 各种排序算法的时间复杂度比较 #### 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序方法,在每次遍历过程中会依次比较相邻的两个元素,如果前者大于后者则交换位置。此过程重复进行直至整个列表有序化。对于长度为 \( n \) 的数组: - 平均时间复杂度:\( O(n^2) \)[^1] - 最佳情况时间复杂度:当输入已经是升序排列时达到最优性能,即 \( O(n) \),因为只需要一次扫描即可确认顺序正确。 - 最差情况下时间复杂度:若初始状态完全逆序,则需执行最多的比较次数,此时时间为 \( O(n^2) \) #### 插入排序(Insertion Sort) 插入排序通过构建有序序列来工作;对于未排序的数据,在已排序序列中从后向前扫描,找到相应位置并将之插入。 - 平均时间复杂度:\( O(n^2) \) - 最佳情况时间复杂度:已经按正向排序过的数据集上表现最佳,其运行速度接近线性增长,大约为 \( O(n) \)。 - 最差情况下时间复杂度:反向排序的数据集合会导致最高级别的效率低下,表现为平方级的增长趋势,也就是 \( O(n^2) \) #### 选择排序(Selection Sort) 该算法的工作原理是从待处理部分选出最小/最大值放到当前子数组末端的位置上去。 - 平均时间复杂度:无论何时都是固定的 \( O(n^2) \),因为它总是要完成固定数量的操作——即使某些时候可以提前终止内部循环也无济于事。 - 最佳情况时间复杂度:同样保持不变,始终是 \( O(n^2) \)。 - 最差情况下时间复杂度:依旧维持在 \( O(n^2) \) 这一水平线上。 #### 归并排序(Merge Sort) 归并排序采用分治法策略来进行操作,它不断地将大问题分解成更小的问题直到变得足够简单可以直接解决为止,之后再逐步组合这些解决方案形成最终解。 - 平均时间复杂度:由于每一次分割都会使问题规模减半而合并阶段又只需线性的额外开销,因此整体而言具有良好的渐近行为,具体来说就是 \( O(n\log{}n) \)[^2] - 最佳情况时间复杂度:即便是在理想条件下也无法超越上述界限,故仍为 \( O(n\log{}n) \)。 - 最差情况下时间复杂度:同理,最糟糕的情形下也不会超过这个数值范围内的预期成本,亦即 \( O(n\log{}n) \) ```python def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] swapped = True if not swapped: break def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr)//2 left_half = merge_sort(arr[:mid]) right_half = merge_sort(arr[mid:]) merged_arr = [] while left_half and right_half: if left_half[0] < right_half[0]: merged_arr.append(left_half.pop(0)) else: merged_arr.append(right_half.pop(0)) merged_arr.extend(left_half or right_half) return merged_arr ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sirius·Black

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值