如何在 python 中将选择排序拆分为两个不同的函数?

How to split Selection sort into two different functions in python?

因为选择排序将输入列表分为两部分:已排序项的子列表和未排序项的子列表,是否可以创建两个不同的函数并将它们连接在一起?我已经完成了我的排序算法,但我不知道如何拆分它们。

def selection_sort(l):
    for i in range(len(l)):
        start_index = i

    for j in range(i + 1, len(l)):

        if l[start_index] > l[j]:
            min_value = j

    l[i], l[start_index] = l[start_index], l[i]

l = [64, 25, 12, 22, 11]
print(l)

我想要的是把它拆分成这样:

def min_index(l, start_index) & def selection_sort(l)

首先,您提供的代码不正确:

  • 只有一次交换发生,无条件地,作为函数的最后一条语句。这当然不可能是对的。对列表进行排序所需的交换次数取决于其顺序。

  • 第二个循环从不迭代:i 已达到输入的长度,因此 range(i + 1, len(i)) 是一个空范围。

  • 从未使用过 min_value 的值。

前两个问题可能是因为你复制代码的方式不对,遗漏了一些必要的缩进。第二个问题是因为两个不同的名字,实际上应该是同一个名字。

这是更正后的版本:

def selection_sort(l):
    for i in range(len(l)):
        start_index = i

        for j in range(i + 1, len(l)):
            if l[start_index] > l[j]:
                start_index = j

        l[i], l[start_index] = l[start_index], l[i]

现在回答你的问题:你确实可以将内循环的逻辑放到另一个函数中。像这样:

def min_index(l, i):
    for j in range(i + 1, len(l)):
        if l[i] > l[j]:
            i = j
    return i

def selection_sort(l):
    for i in range(len(l)):
        j = min_index(l, i)
        l[i], l[j] = l[j], l[i]

您的选择排序有问题,所以我更正了它。简而言之:

  1. 缩进不正确,因此循环没有嵌套(我认为这可能是由于此平台上的格式问题造成的)。
  2. 在您的内部循环中,您针对 j 测试 start_index 但更新 min_value.
  3. 在内部循环的末尾,您使用 start_index 进行交换。 start_index 总是等于 i.

这是更正后的版本,为了更好地阅读,对一些变量进行了重命名。

def selection_sort(arr): 
    for i in range(len(arr)): 
        min_index = i 
 
        for j in range(i + 1, len(arr)): 
 
            if arr[min_index] > arr[j]:  
                min_index = j 
 
        arr[i], arr[min_index] = arr[min_index], arr[i]

重构后的版本分为两部分:

def selection_sort2(arr):  
    for i in range(len(arr)-1):  
        min_index = get_min_index(i, arr)  
   
        arr[i], arr[min_index] = arr[min_index], arr[i]


def get_min_index(i, arr):  
    min_index = i  
    for j in range(i + 1, len(arr)):  
  
        if arr[min_index] > arr[j]:   
            min_index = j 
    return min_index