【问题标题】:Sorting in ascending order with selection sort使用选择排序按升序排序
【发布时间】:2021-04-29 08:11:56
【问题描述】:

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

下面是我的代码:

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, 7, 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, 2, 40, 42, 14, 17, 4, 26]。现在解决它交换了 7 次,但在我的测试程序中它假设交换了 8 次。这是因为40的重复吗?

如何配置我的代码,以便它考虑到相同数字的重复?

【问题讨论】:

  • "现在计算它交换了 7 次,但在我的测试程序中它假设交换了 8 次。"你的意思是你期望 7,但是你的代码打印8?因为如果是这样,当我运行它时,我得到了7,正如预期的那样。
  • 如果情况正好相反并且您期望 8 次交换(我无法从您的措辞中完全看出),那么我同意 Blckkght 的 answer。无需使用该输入交换 8 次。

标签: python computer-science


【解决方案1】:

如果您应该在有一对重复值时计算额外的交换,那么满足该期望的一种简单方法是将numbers[j] &lt; numbers[minIndex]检查更改为使用&lt;=而不是&lt;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2015-11-01
    • 2014-04-11
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多