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

2024-04-20 12:28:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个存储测验高分的数组。我有一个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

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


2条回答

您可以使用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不应在内部循环中减少,因为这将使外部循环在内部循环完成后退出。应在外部循环中减少

以下情况并未破坏算法,但仍应予以纠正:

  • swapScores = True应该发生在if块中,否则它实际上无助于缩短算法

  • 如果您修复了上述错误,那么counteri将是相等的,因此您可以只使用i和drop 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代码的自定义实现更快地完成这项工作

相关问题 更多 >