【问题标题】:Logic Impasse in a Simple Insertion Sort简单插入排序中的逻辑僵局
【发布时间】:2011-08-07 11:19:18
【问题描述】:

我正在自学 Python,但我在一个相对简单的概念上遇到了困难。目标是使用插入排序按升序对列表进行排序。代码如下:

def InsertionSort(A):
    for j in range(1, len(A)):
        key = A[j]
        i = j - 1
        while (i >=0) and (A[i] > key):
            A[i+1] = A[i] # this is the not understood point
            i = i - 1
        A[i+1] = key
    print A

我不明白加粗的步骤是如何工作的。例如,如果我有一个 [6,5,4,3,1] 的列表并且我进行了第二次迭代,那么我的列表现在不是 [6,6,4,3,1] 吗?我正在分配 A[i+1](在第一种情况下为 5)A[i] 的值(在第一种情况下为 6)。我的5怎么了?我最初对代码的尝试是:

def InsertionSort(A):
    for j in range(1, len(A)):
        key = A[j]
        i = j - 1
        while (i >=0) and (A[i] > key):
            temp = A[i+1]
            A [i+1] = A[i]
            A[i] = temp
            i = i - 1
        A[i+1] = key
    print A

这个方法也有效。我不明白为什么第一个也一样。有没有人想一针见血?

【问题讨论】:

  • 算法研究!= 给定编程语言的研究。您使用 Python 的事实只是这个问题的附带问题,它是关于理解算法实现的逻辑。

标签: python sorting insertion-sort


【解决方案1】:

我认为这只是因为A[i+1]=key这行。

第一个算法执行以下操作:考虑列表[1,2,4,5,3],假设我们在迭代j=4,即我们正在考虑列表元素3。该算法将元素 3 存储在 key 中并检查以下内容:

[1,2,4,5,3]
       ^    5>3 (key) => move 5 forward by 1 => [1,2,4,5,5]
[1,2,4,5,5]
     ^      4>3 (key) => move 4 forward by 1 => [1,2,4,4,5]
[1,2,4,4,5]
   ^        2<3 => stop inner while loop
now, make A[i+1]=key (remember: key is 3):
[1,2,3,4,5]

与上述相反,第二种算法实际上交换每次迭代中的元素:

[1,2,4,5,3]
       ^    5>3 (key) => swap 5 and 3 => [1,2,4,3,5]
[1,2,4,3,5]
     ^      4>3 (key) => swap 4 and 3 => [1,2,3,4,5]
[1,2,3,4,5]
   ^        2<3 => stop while loop 
now, make A[i+1]=key (remember: key is 3): (this is unnecessary!)
[1,2,3,4,5]

【讨论】:

    【解决方案2】:

    如果您以[6,5,4,3,1] 开头,则迭代将如下所示:

    第一步:

    [6,5,4,3,1] 
        ## first number sorted`
    

    第二步(j=2):

    key <- 5
    
    A <- [6,6,4,3,1], i <- -1  
        ## the 5 will be overridden but is still save in the key variable
    
    A <- [5,6,4,3,1]        
        ## A[i+1] = key will restore the 5
    

    唯一可以“丢失”的值是A[j] 中包含的值。但这个值总是保存在变量key 中,因此可以在最后一步恢复。

    【讨论】:

    • @mv2323:重点是key会记住你在循环结束时恢复的值,所以你不会丢失信息。
    猜你喜欢
    • 2011-06-03
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2021-02-02
    相关资源
    最近更新 更多