使用选择排序

问题描述

我需要很大的帮助,我似乎无法弄清楚如何执行此代码。因此,我使用选择排序按升序对未排序的数字列表进行排序,然后返回对列表进行排序所需的交换次数

下面是我的代码

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}}。

虽然这让代码变得更糟,所以我一定要仔细检查这种期望是否真的存在。设法以更少的交换进行排序应该是一个功能,而不是一个错误!