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



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

排序前的所有分数如下所示:

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

排序"完成"后,它们显示为:

[(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

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

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

  • i在外循环的迭代中不会重置为 0,这意味着第二次计算内循环的range时,它是一个空范围。实际上,该范围应始终从 0 开始。

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

  • 不应在内循环中减少lengthHighscore,因为这会使外循环在内循环完成后退出。它应该在环中减少。

以下情况没有破坏算法,但仍值得纠正:

  • 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 代码的自定义实现更快地完成工作。

您可以使用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)

最新更新