如何让冒泡排序算法遍历数组中的所有条目?

How do I make my bubble sort algorithm go through all entries in my array?

我有一个存储测验高分的数组。我有一个 for 循环应该让冒泡排序遍历所有条目,但是它没有按预期运行并且似乎

排序前的所有分数如下:

[(3, ), (0, ), (1, ), (0, ), (3, ), (0, ), (0, ), (3, ), (69, )]

排序后为'completed',它们显示为:

[(3, ), (1, ), (0, ), (3, ), (0, ), (0, ), (3, ), (0, ), (69, )]

如您所见,它们似乎已经排序到一定程度,但在它们完全按升序到降序之前,它不会完全循环回到开始和求助。

代码是:

        swapScores = True
        while swapScores == True and lengthHighscore >= 0:
            swapScores = False
            for counter in range(i, lengthHighscore - 2):
                if leaderboardScores[i] < leaderboardScores[i + 1]:
                    tempScore = leaderboardScores[i]
                    leaderboardScores[i] = leaderboardScores[i + 1]
                    leaderboardScores[i + 1] = tempScore
                lengthHighscore = lengthHighscore - 1
                i = i + 1
                swapScores = True

任何帮助都会很棒,谢谢!!我的代码可能没有我想要的那么高效,但在这一点上我真的更注重功能而非效率哈哈 :)

您可以使用 sorted.

轻松地对元组列表进行排序
leaderboardScores = [(3, ), (0, ), (1, ), (0, ), (3, ), (0, ), (0, ), (3, ), (69, )]

# sort ascending
sorted_asc_leaderboardScores = sorted(leaderboardScores, key = lambda score: score[0])

# sort descending
sorted_desc_leaderboardScores = sorted(leaderboardScores, key = lambda score: score[0], reverse=True)

您在实现冒泡排序时存在一些问题:

  • i在外层循环的迭代中并没有被重置为0,也就是说第二次对内层循环的range进行求值,是一个空范围。事实上,该范围应始终以 0 开头。

  • 该范围应达到并包括 lengthHighscore - 2,因此范围应为 range(lengthHighscore - 1) 而不是 lengthHighscore - 2

  • lengthHighscore不应该在内循环中减少,因为那样会使内循环结束后外循环退出。它应该在 outer 循环中减少。

以下未破坏算法,但仍需更正:

  • swapScores = True 应该出现在 if 块中,否则它对缩短算法没有真正帮助。

  • counteri 将是相等的,如果你修正了上述错误,那么你可以只使用 i 并删除 counter

  • Python 有一个很好的语法来交换值而不使用显式临时变量

  • 外循环也可以用range来实现,这样你就不必显式地减少lengthHighscore。然后可以使用 if not swapScores 作为快捷方式跳出该循环。

更正后的代码:

for last in range(len(leaderboardScores) - 1, 0, -1):
    swapScores = False
    for i in range(last):
        if leaderboardScores[i] < leaderboardScores[i + 1]:
            leaderboardScores[i], leaderboardScores[i + 1] = leaderboardScores[i + 1], leaderboardScores[i]
            swapScores = True
    if not swapScores:
        break

这将按降序排列分数。如果您需要升序排列,请将 if 条件更改为使用 > 而不是 <.

显然,没有必要实现自己的排序算法,因为 Python 有一个 sort 方法和一个 sorted 函数。这些将比使用 Python 代码的任何自定义实现更快地完成工作。