我有一个数组,用于存储测验的高分。我有一个 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
块中,否则它对算法的捷径没有真正的帮助。 -
如果您修复上述错误,
counter
和i
将是相等的,因此您可以使用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)