【问题标题】:Can someone please explain me the logic behind this statement about bubble sort?有人可以解释一下这个关于冒泡排序的陈述背后的逻辑吗?
【发布时间】:2011-12-15 23:04:50
【问题描述】:

假设我们有一个名为 A 的数组。

令 Π 是一组 (x,y) 对,其中 x,y 是存在于 A 和 index(x) y 的数组中的值。

例如,如果我们有这个数组

      3 2 9 8 3 0

那么 (3,2) 将在 Π 中。 (3,0) 也将在Π中。

Π 中的所有对将如下

   { (3,2), (3,0), (8,0), (9,0),(9,3),(2,0),(8,3),(9,8) }

希望我没有忘记什么

我意识到,如果我们修复所有这些对,那么我们将对数组进行排序。当我说修复时,我的意思是,例如 (3,2) 使其成为 (2,3) 以及其他人

我不明白的是,冒泡排序在每个步骤中修复了多少对?我的老师告诉我 1 我不明白这个

让我们运行冒泡排序

 3 2 9 8 3 0
 2 3 9 8 3 0
 2 3 9 8 3 0
 2 3 8 9 3 0
 2 3 8 3 9 0
 2 3 8 3 0 9

 2 3 8 3 0 9
 2 3 8 3 0 9
 2 3 3 8 0 9
 2 3 3 0 8 9

 2 3 3 0 8 9
 2 3 3 0 8 9
 2 3 0 3 8 9

 2 3 0 3 8 9
 2 0 3 3 8 9

 0 2 3 3 8 9

难道没有一些冒泡排序不能解决问题的步骤吗?那么,冒泡排序每一步最多只能修复1个点是正确的答案吗?

【问题讨论】:

    标签: sorting bubble-sort


    【解决方案1】:

    在我看来,在您的示例数据集中,冒泡排序总是会“修复”一个元素,因为每个元素都是无序的。但是,如果您要将 0 移到更靠近原始列表的前面,那么您将生成一些已经按排序顺序排列的对。这些对不会被冒泡排序“修复”,在这种情况下,您可以正确地说冒泡排序可以在每个步骤中“修复”多达 1 个元素。

    所以在一般情况下,您是正确的。在您在示例中使用的具体案例中,老师是正确的。

    注意:我假设“步骤”是指将冒泡排序算法应用于集合中的一对数字。

    【讨论】:

    • Aroth,感谢您的回答。在这种情况下: 2 3 3 0 8 9 2 3 3 0 8 9 没有任何变化。是否取决于实现?
    • 也许我没有正确理解您的问题。您是对数字列表还是对列表中的对运行冒泡排序?如果是前者,那么这对有什么关系呢?此外,我不确定如何“修复”所有对也对列表进行排序。您的一组对包含比列表更多的数字,即使每一对都是固定的,结果集中的第一个数字也是 2,而不是 0。
    【解决方案2】:

    冒泡排序涉及重复遍历数组。在每次遍历数组的过程中,它会反复交换碰到它们时无序的相邻元素。

    仅当元素无序时,从一个条目到另一个条目的每一步交换。

    每次遍历数组都会修复至少一个乱序对,除非没有(即数组已经排序,并且通过没有变化的遍历是完成信号)。

    我怀疑您正在考虑步骤,而您的教授正在考虑通过,但无论如何他并不完全正确,因为通过整个阵列的某些通过可以修复多个无序对,而最后一个通过则无法解决任何问题(因为此时不需要修复)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 2013-07-13
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      相关资源
      最近更新 更多