在简单的冒泡排序中获取交换数量和通过的问题

Problems with getting number of swaps and passing through in simple bubble sort

在解决程序时。冒泡排序任务 I 运行 变成了一个问题。所以,我需要计算数组中的交换次数和通过数组的次数。其实是有输出的。 在我的代码中,数组排序正确,但计数器工作错误。

step = int(input())
a = list(map(int, input().split()))
passage_number = 0
swap_number = 0
for x in range(step):
    for i in range(step-x-1):
        passage_number += 1
        if a[i] <= a[i+1]:
            a[i], a[i+1] = a[i+1], a[i]
            swap_number += 1

print(passage_number, swap_number)

示例输入(两个字符串)和输出:

8
3 1 4 1 5 9 2 6

5 8

(现在 returns 像“21 14”等,取决于变量的位置)

我认为问题出在变量位置不正确,但我花了大约 6 个小时无法解决这个简单的问题。我尝试将变量设置为不同的位置并使用变量 'step' 到期,但所有尝试均未成功。 如果你能告诉我我应该在我的代码中更改什么来解决这个问题,我将非常感激(突然 google 没有回答 btw :D)

  1. 你是按升序排列的吗?如果是,交换条件应该是if a[i] > a[i+1]:,而不是if a[i] <= a[i+1]:
  2. passage_number += 1需要放在for x in range(step):for i in range(step-x-1):
  3. 之间

看起来任务正在使用所谓的 'modified bubble sort',它使用一个标志,如果单次通过它导致没有交换,则该标志会停止算法。要实现这一点,您只需要在循环开始之前设置一个标志,让外圈重置它,并让任何交换翻转它,然后有一个条件中断语句在每次通过后进行测试。您的代码的循环部分将是这样的:

for x in range(step - 1):
    passage_number += 1
    flag = True
    for i in range(step - 1):
        if a[i] > a[i+1]:
            a[i], a[i+1] = a[i+1], a[i]
            swap_number += 1
            flag = False
    if flag:
        break

这为您的序列提供 5 8