问题描述
我需要很大的帮助,我似乎无法弄清楚如何执行此代码。因此,我使用选择排序按升序对未排序的数字列表进行排序,然后返回对列表进行排序所需的交换次数。
下面是我的代码:
def swaps(numbers):
count = 0
for i in range(len(numbers)):
minIndex = i
for j in range(i + 1,len(numbers)):
if numbers[j] < numbers[minIndex]:
minIndex = j
if i != minIndex:
numbers[i],numbers[minIndex] = numbers[minIndex],numbers[i]
count += 1
return count
对于这两个测试用例:
numbers = [0,4,2,7,5]
print(swaps(numbers))
numbers = [9,8,6,5,4]
print(swaps(numbers))
它工作得很好,但对于这个测试用例它不起作用:
import random
random.seed(30)
numbers = [random.randint(1,50) for index in range(10)]
print(numbers)
print(swaps(numbers))
此测试用例的编号列表是 [35,19,40,42,14,17,26]
。现在解决了它交换了 7 次但在我的测试程序中它假设已经交换了 8 次。这是因为重复 40
吗?
如何配置我的代码,使其考虑到相同数字的重复?
解决方法
如果您应该在有一对重复值时计算额外的交换,那么满足该期望的一种简单方法是将 numbers[j] < numbers[minIndex]
检查更改为使用 <=
而不是 {{ 1}}。
虽然这让代码变得更糟,所以我一定要仔细检查这种期望是否真的存在。设法以更少的交换进行排序应该是一个功能,而不是一个错误!