Python 3.x 就地插入排序比创建新列表的插入排序慢?
我有两个插入和两种方法。插入所需时间明显长于插入2(5.346比0.0313)。需要帮忙找出原因吗Python 3.x 就地插入排序比创建新列表的插入排序慢?,python-3.x,sorting,insertion-sort,Python 3.x,Sorting,Insertion Sort,我有两个插入和两种方法。插入所需时间明显长于插入2(5.346比0.0313)。需要帮忙找出原因吗 PS:搜索基本上是二进制搜索的一个辅助功能。您在第一个功能中做了很多工作。找到插入点后,您可以不断交换项目,将项目从[i]移动到[j],在第二个数组中,您可以使用插入函数将项目插入到第二个数组中。这只会将数组中的所有内容向下移动1 换句话说,您在第一个中的插入会执行以下操作: def insertion(sequence): for i in range(1, len(sequence))
PS:搜索基本上是二进制搜索的一个辅助功能。您在第一个功能中做了很多工作。找到插入点后,您可以不断交换项目,将项目从
[i]
移动到[j]
,在第二个数组中,您可以使用插入
函数将项目插入到第二个数组中。这只会将数组中的所有内容向下移动1
换句话说,您在第一个中的插入会执行以下操作:
def insertion(sequence):
for i in range(1, len(sequence)):
key = sequence[i]
j = search(sequence,0,i-1,key)
while i > j:
sequence[i], sequence[i-1] = sequence[i-1], sequence[i]
i = i - 1
return sequence
def insertion2(sequence):
new_li = [sequence[0]]
for i in range(1,len(sequence)):
key = sequence[i]
j = search(new_li,0,len(new_li)-1,key)
new_li.insert(j,key)
return new_li
因此,对项目必须移动的每个位置执行四次数组访问和三次赋值
在第二个函数中,insert
函数基本上执行以下操作:
while i > j
temp = sequence[i]
sequence[i] = sequence[i-1]
sequence[i-1] = temp
i = i-1
x=len(新的\u li)-1
而x
在这里,您只需对必须移动的每个项目执行两次数组访问和一次赋值
您可以通过编写代码将要移动的项复制到一个临时变量中,并编写一个与我展示的第二个循环基本相同的循环,将内容从
j
移动到I
下一个空间,然后将保存的项放入sequence[j]
中,从而加快速度。此外,运行时的不同顺序为100倍,是不是应该更接近5/6x?@Xuan:运行时间上的巨大差异可能是因为Pythoninsert
函数是Python运行库的一部分,它经过了高度优化。我重写了这两个函数。你看一下,差异仍然在100倍左右。其中一个使用array[i]=array[i-1],而另一个使用insert method@Xuan如果要验证差异是由于insert
的库实现造成的,请用上面描述的循环替换insert
调用。这将使两个版本都使用array[i]=array[i-1]
。这将使两个版本使用相同的换档代码。
x = len(new_li)-1
while x < j
new_li[i+1] = new_li[i]
i = i - 1