【问题标题】:How to split Selection sort into two different functions in python?如何在python中将选择排序拆分为两个不同的函数?
【发布时间】:2021-12-30 21:41:27
【问题描述】:

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

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)

【问题讨论】:

  • 您的min_value 从未使用过。您的代码不会对输入进行排序。你跑了吗??

标签: python algorithm selection-sort


【解决方案1】:

首先,你提交的代码不正确:

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

  • 第二个循环永远不会迭代: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]

【讨论】:

  • 非常感谢。我总是收到一条错误消息:未使用局部变量,这解释了原因。
【解决方案2】:

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

  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

【讨论】:

  • 我明白了,非常感谢。
猜你喜欢
  • 2021-08-30
  • 2014-07-31
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多