如何在 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]
您的选择排序有问题,所以我更正了它。简而言之:
- 缩进不正确,因此循环没有嵌套(我认为这可能是由于此平台上的格式问题造成的)。
- 在您的内部循环中,您针对
j
测试 start_index
但更新 min_value
.
- 在内部循环的末尾,您使用
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
因为选择排序将输入列表分为两部分:已排序项的子列表和未排序项的子列表,是否可以创建两个不同的函数并将它们连接在一起?我已经完成了我的排序算法,但我不知道如何拆分它们。
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]
您的选择排序有问题,所以我更正了它。简而言之:
- 缩进不正确,因此循环没有嵌套(我认为这可能是由于此平台上的格式问题造成的)。
- 在您的内部循环中,您针对
j
测试start_index
但更新min_value
. - 在内部循环的末尾,您使用
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