Inplace insert sort比创建新列表的插入排序慢?

时间:2017-12-06 06:18:37

标签: python-3.x sorting insertion-sort

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:搜索基本上是二进制搜索的辅助功能。

1 个答案:

答案 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