Grokking算法中的SelectionSort

时间:2018-10-26 09:06:21

标签: python-3.x for-loop syntax

我正在为Grokking算法书SelectionSort中的 for range()循环而苦恼

def findthesmallest(arr):
    # suppose that the left list is sorted
    min = arr[0]
    min_index = 0

    for i in range(len(arr)):
        if arr[i] < min:
            min = arr[i]
            min_index = i

    return min_index

def selectionsort(arr):
    new_arr = []
    # For each i+= 1, n-=1 
    for i in range (len(arr)):
        min_index = findthesmallest(arr)
        # Add item to new_arr and update the arr
        new_arr.append(arr.pop(min_index))

    return new_arr

print (selectionsort([5, 3, 4, 8, 10]))
  • 因此在第二个 selectionsort() for_loop中,每次我们完成迭代时,len(arr)-1
  • 当我增加每次迭代时,range(len(arr))减小。
  • 当我尝试检查每个迭代的每个(i,len(arr))时,我得到: (0,5),(1、4),(2、3),(3、2),(4、1)
  • 我怎么可能在range(1)中= 4?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您阅读the documentation about for,将会看到

  

表达式列表只计算一次

这意味着range(len(arr))在第一次迭代之前将被评估一次,然后不再进行评估。这意味着您对arr所做的更改将不会在以后的循环迭代中被注意到。

您需要其他方式来迭代arr,也许是while循环。或添加检查以确保i没有超出范围。