python - 插入排序两种不同实现的效率分析
问题描述
我为 Python 中的简单插入排序算法提出了两个实现。我的问题:第二个实现比第一个更有效吗?因为在第一个实现中似乎是这样,对于 while 循环的每次迭代,程序必须执行两个赋值:list[i]
被赋值,list[i-1]
反之亦然(除了减i
1)。
def insertion1(list):
for i in range(1,len(list)):
while i >= 1 and list[i] < list[i-1]:
list[i],list[i-1] = list[i-1],list[i]
i -= 1
但是在第二种实现中,程序必须为 while 循环的每次迭代进行一次赋值:(同样除了在 while 循环终止后list[index + 1] = list[index]
减1 和一次额外的赋值:) 。index
list[index + 1] = temp
def insertion2(list):
for i in range(1,len(list)):
temp = list[i]
index = i - 1
while index >= 0 and list[index] > temp:
list[index + 1] = list[index]
index -= 1
list[index + 1] = temp
这是否意味着insertion1
与 相比,要进行大约两倍的赋值语句insertion2
,从而insertion2
更准确地实现插入排序?
解决方案
你的推理是正确的。然而,即使insertion2
是次优的。内部循环每次迭代进行 2 次比较index >= 0
(和list[index] > temp
)。可以将其简化为(几乎)一个比较:
if temp < list[0]:
# We don't care about values anymore. Every element shall be shifted.
while index >= 0:
list[index + 1] = list[index]
index -= 1
else:
# We don't care about indices anymore. list[0] is a natural sentinel
while temp < list[index]:
list[index + 1] = list[index]
index -= 1
list[index] = temp
推荐阅读
- c# - C#裁剪图像梯形/多边形
- flutter - 连接两个 document.data()['field'] 字段
- flutter - 在没有 super.dispose() 的情况下覆盖 dispose() 是否有效?
- google-apps-script - 如何使用新工作表作为输入源来总结将它们排序为日期的值
- python - 如何将函数与python中的列表结合起来?
- c++ - 如何在 CMake 中使用 Boost Log?Find_Package 错误
- mysql - SQL 两个 Fk 在同一列
- r - 尝试安装 tidyverse(集群 slurm)时遇到问题
- javascript - 如何将自动完成或 keydown 绑定到动态创建的跨度?
- php - 我无法使用 php 和 htaccess 进行分页