首页 > 解决方案 > 如何使用嵌套的 for 循环重写这个 while 循环?

问题描述

我遵循了一个带有while循环的算法,但问题的一个参数是我使用嵌套的 for 循环,我不知道该怎么做。

这是while循环:

i = len(lst)
while i > 0:
    big = lst.index(max(lst[0:i]))
    lst[big], lst[i-1] = lst[i-1], lst[big]
    i = i - 1
    return lst

这是它要回答的问题:

输入:[5,1,7,3]

首先,找到最大的数,即7
将它与当前位于列表末尾的数字交换,即3. 现在我们有:[5,1,3,7]
现在,找到最大的数,不包括7,即5
交换它和倒数第二个数字,即3. 现在我们有:[3,1,5,7]
现在,找到第三大数(不包括前两个数),即3
交换它和倒数第三个数字,即1.

输出:[1, 3, 5, 7]

标签: python

解决方案


您在算法中看到的是选择排序。这是您提出的第二个解决方案(嵌套for循环):

def insertion_sort(arr):
    l = len(arr)
    for i in range(l-1, -1, -1):
        m = -10000 # it should be lower than min(arr)
        idx = -1
        for key, val in enumerate(arr[:i+1]):
            if m < val:
                m = val
                idx = key
        if idx != -1:
            arr[i], arr[idx] = arr[idx], arr[i]
    return arr

快速测试:

arr = list(range(10))[::-1]
print(arr)
# prints [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
result = insertion_sort(arr)
print(result)
# prints [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

推荐阅读