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
我有2次插入,有2种方法。插入比插入2要长得多(5.346与0.0313相比)。需要帮助找出原因
PS:搜索基本上是二进制搜索的辅助功能。
答案 0 :(得分:1)
你在第一个工作中做了很多工作。当您找到插入点时,您会不断交换项目以将项目从[i]
移动到[j]
。在第二个中,您使用insert
功能将项目插入第二个阵列。这只会将数组中的所有内容向下移动一个。
换句话说,你插入第一个就是这样:
while i > j
temp = sequence[i]
sequence[i] = sequence[i-1]
sequence[i-1] = temp
i = i-1
因此,您需要为项目必须移动的每个位置执行四次数组访问和三次分配。
在第二个中,insert
函数基本上是这样的:
x = len(new_li)-1
while x < j
new_li[i+1] = new_li[i]
i = i - 1
在这里,您只需要进行两次数组访问,并为每个必须移动的项目进行一次分配。
你可以通过编写将要移动的项目复制到临时变量的代码来加快速度,并且循环与我展示的第二个循环基本相同,以便将事物从j
移动到{{1向下移动一个空格,然后将保存的项目放入i
。