Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 就地插入排序比创建新列表的插入排序慢?_Python 3.x_Sorting_Insertion Sort - Fatal编程技术网

Python 3.x 就地插入排序比创建新列表的插入排序慢?

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))

我有两个插入和两种方法。插入所需时间明显长于插入2(5.346比0.0313)。需要帮忙找出原因吗


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:运行时间上的巨大差异可能是因为Python
insert
函数是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