如何让冒泡排序算法遍历数组中的所有条目?
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
块中,否则它对缩短算法没有真正帮助。
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 代码的任何自定义实现更快地完成工作。
我有一个存储测验高分的数组。我有一个 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
块中,否则它对缩短算法没有真正帮助。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 代码的任何自定义实现更快地完成工作。