【问题标题】:SelectionSort in Grokking AlgorithmGrokking 算法中的选择排序
【发布时间】:2019-03-31 00:10:04
【问题描述】:

我在 Grokking Algorithm 书 SelectionSort 中的 for loop in 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
  • 当 i 增加每次迭代时,range(len(arr)) 会减少。
  • 当我尝试检查每个迭代的每个 (i, len(arr)) 时,我得到: (0,5), (1, 4), (2, 3), (3, 2), (4, 1)
  • i = 4 in range(1) 怎么可能?

提前致谢!

【问题讨论】:

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


    【解决方案1】:

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

    表达式列表被计算一次

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

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

    【讨论】:

    • 谢谢你的答案。 While_loop 绝对适合我。我仍然试图想象我在这里做什么功能。它是否在跟踪循环次数的同时简单地遍历原始和更新的 [arr]?
    猜你喜欢
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2019-04-24
    • 2021-02-06
    相关资源
    最近更新 更多