我有一个存储测验高分的数组。我有一个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
任何帮助都会很好,谢谢!!我的代码可能没有我想要的那么高效,但我现在真的是追求功能而不是效率,哈哈:)
您可以使用
sorted
轻松地对元组列表进行排序气泡排序的实现中有几个问题:
i
在外循环的迭代中没有重置为0,这意味着第二次计算内循环的range
时,它是一个空范围。事实上,该范围应始终以0开头这个范围应该上升到并包括
lengthHighscore - 2
,因此范围应该是range(lengthHighscore - 1)
,而不是lengthHighscore - 2
lengthHighscore
不应在内部循环中减少,因为这将使外部循环在内部循环完成后退出。应在外部循环中减少以下情况并未破坏算法,但仍应予以纠正:
swapScores = True
应该发生在if
块中,否则它实际上无助于缩短算法如果您修复了上述错误,那么
counter
和i
将是相等的,因此您可以只使用i
和dropcounter
Python有一个很好的语法,可以在不使用显式临时变量的情况下交换值
外循环也可以用
range
实现,这样就不必显式地减少lengthHighscore
。然后可以使用if not swapScores
作为一条捷径打破这个循环更正代码:
这将按降序排列分数。如果需要升序,则将
if
条件更改为使用>
而不是<
显然,不需要实现您自己的排序算法,因为Python有一个
sort
方法和一个sorted
函数。这些将比任何使用Python代码的自定义实现更快地完成这项工作相关问题 更多 >
编程相关推荐