【问题标题】:How does bubble sort compare to selection sort?冒泡排序与选择排序相比如何?
【发布时间】:2021-02-09 13:40:22
【问题描述】:

哪种排序技术更快:冒泡排序或选择排序,为什么?两者效率一样吗?

【问题讨论】:

  • 您是在考试中使用移动设备还是参加家庭考试或其他什么?来吧。
  • no..这个问题是在一次采访中问我的。我说它们是冒泡排序。因为在冒泡排序中比较了连续的元素,这些元素存储在连续的内存位置,所以需要更少的时间。任何意见。
  • ...或两者都同样低效...
  • 这是我上学期考试的结果。
  • 这是一个糟糕的面试问题。它没有提供大学成绩单尚未提供的任何信息(您在基本的 CS 课程中是否有脉搏是可以从这个问题中收集到的全部信息)。我认为“Interviewing Programmers for Industry”应该是 CS 学位的大学必修课程。

标签: algorithm sorting


【解决方案1】:

Wikipedia 说(强调):

在简单的平均情况下 Θ(n2) 算法,选择排序差不多 总是优于冒泡排序和 gnome 排序,但一般是 优于插入排序。 插入排序在这方面非常相似 在第 k 次迭代后,第一个 k 数组中的元素已排序 命令。插入排序的优点是 它只扫描尽可能多的元素 它需要为了放置 k + 1st 元素,而选择排序必须 扫描所有剩余元素以找到 第 k + 1 个元素。

简单的计算表明 因此插入排序通常会 执行大约一半的比较 作为选择排序,虽然它可以 执行相同或更少 取决于数组的顺序 在排序之前。可以看作 一些实时的优势 选择排序的应用程序将 执行相同,无论 数组的顺序,同时插入 排序的运行时间可能会有所不同 相当。然而,这更 通常是插入排序的优势 因为它运行效率更高 如果数组已经排序或 “接近排序。”

虽然选择排序优于 根据数量的插入排序 写 (Θ(n) 交换与 Ο(n2) 互换),它几乎总是远远超过 (并且永远不会超过)写入次数 循环排序使循环排序 在数量上理论上是最优的 的写入。这可能很重要,如果 写入明显更多 比读取昂贵,例如 EEPROM或闪存,其中每 写减少了的寿命 记忆。

最后,选择排序大大 在较大的阵列上表现优于 Θ(n log n) 分治算法 比如归并排序。然而,插入 排序或选择排序都是 小型阵列通常更快 (即少于 10-20 个元素)。一个 在实践中有用的优化 递归算法是切换 插入排序或选择排序 对于“足够小”的子列表。

还有,bubble sort 上的维基百科(已添加重点):

冒泡排序有最坏情况和平均情况 复杂度都 О(n2),其中 n 是 正在排序的项目数。那里 存在许多排序算法 明显更好的最坏情况或 O(n log n) 的平均复杂度。甚至 其他О(n2) 排序算法,例如 作为插入排序,往往有更好的 性能优于冒泡排序。 因此,冒泡排序不是 n 为时的实用排序算法 大。

唯一的显着优势是 冒泡排序优于其他大多数 实现,甚至是快速排序,但是 不是插入排序,是 检测列表的能力 sorted 被有效地内置到 算法。冒泡排序的性能 在一个已经排序的列表上 (最佳情况)是 O(n)。相比之下,大多数 其他算法,即使是那些 更好的平均情况复杂度, 执行他们的整个分拣过程 在片场,因此更复杂。 但是,不仅插入排序 也有这个机制,但它也 在以下列表中表现更好 基本上排序(有一个小 反转次数)。

【讨论】:

  • 问题没有提到插入排序
【解决方案2】:

与冒泡排序相比,选择排序执行的交换次数更少;因此,即使两种排序方法都是 O(N2),选择排序的执行速度更快,效率更高!

【讨论】:

    【解决方案3】:

    在比较这两种算法时,我们必须考虑这些算法中发生的两种操作 i) 比较 ii) 交换 在比较操作的基础上,两者都同样有效 但是如果你考虑交换操作你会发现选择排序更有效 考虑一个大小为 100 的数组以降序排列,我们必须按升序对它们进行排序 在这个问题中 BUBBLE SORT 将需要 100*100=(10000)apprx 交换操作,而在 SELCTION SORT 的情况下只需要 100 个交换操作,因为在每个选择排序中迭代只发生一次交换

    【讨论】:

      【解决方案4】:

      冒泡排序算法被认为是最简单且效率最低的算法,但选择排序算法与冒泡排序相比效率更高。冒泡排序也会消耗额外的空间来存储临时变量并且需要更多的交换。

      【讨论】:

      • 我不同意冒泡排序为临时变量占用更多空间的说法。对于选择排序,使用一个临时变量来保存最小值或最大值。那不是同样的空间吗?
      • 我也不明白为什么冒泡排序会消耗额外的空间来存储临时变量?
      • 我对额外的空间要求有疑问,因为聪明的编程可以解决额外的空间需求
      【解决方案5】:

      尽管 Senthil 的 link 正朝着正确的方向前进,但我似乎无法在这里或其他地方找到令人满意的解决方案。

      这个问题最初让我感到困惑,因为可以通过在未能执行值交换的子数组(或链表等)传递后提前终止外循环来优化冒泡排序。以这种方式无法帮助选择排序,那么为什么它会表现出色呢?两者在一般使用中都很弱 - O(n^2) - 那么为什么至少可以稍微改进的那个不是更好呢?

      纯粹基于对我自己和其他实现的检查,答案是冒泡排序在每次比较命中时都会进行值交换(读、写、写)。 Select sort 只记下新的边界值(min 表示升序排序,max 表示降序),然后在 pass 结束时将其换出。

      void swapInt(int *ptr1, int *ptr2) {
         int temp;
      
         temp = *ptr1;
         *ptr1 = *ptr2;
         *ptr2 = temp;
      }
      
      /* compare and swap over a shrinking sub-array */
      void bubbleSortArray(int a[], const int aSize) {
         int unsorted, i, iMax = (aSize - 1);
      
         do {
            unsorted = 0;
            for (i = 0; i < iMax; i++) {
               if ( a[i] > a[i + 1] ) {
                  unsorted = 1;
                  /* swap every time comparison is true */
                  swapInt(&a[i], &a[i + 1]);
               }
            }
            --iMax;
         } while (unsorted);
      }
      
      /* compare to find min value, write it before shrinking the sub-array */
      void selectSortArray(int a[], const int aSize) {
         int i, j, mindex;
      
         for (i = 0; i < (aSize - 1); i++) {
            mindex = i;
            for (j = (i + 1); j < aSize; j++) {
               if ( a[j] < a[mindex] ) mindex = j;
            }
            /* swap after inner loop terminates */
            swapInt(&a[i], &a[mindex]);
         }
      }
      

      【讨论】:

        【解决方案6】:

        尽管它们都具有可比和糟糕、最坏和平均情况的复杂性,但有 certain points 表明选择排序优于冒泡排序。

        选择排序花费了大部分时间 试图找到最小值的时间 的“未排序”部分中的元素 大批。它清楚地表明了相似性 选择排序和冒泡排序 种类。冒泡排序“选择” 每个最大剩余元素 阶段,但浪费一些精力 赋予“未分类”一些命令 数组的一部分。

        【讨论】:

          【解决方案7】:

          冒泡排序使用更多的交换时间,而选择排序避免了这种情况。

          当使用选择排序时,它最多交换 n 次。但是当使用冒泡排序时,它几乎交换了 n*(n-1)。很明显,即使在内存中,读取时间也少于写入时间。比较时间和其他运行时间可以忽略。所以交换时间是问题的关键瓶颈。

          【讨论】:

            【解决方案8】:

            在冒泡排序中,我们有更多的比较和交换。

            在一个包含 10 个元素的数组中,我们在第一轮中进行了 9 次比较,在第二次 7,6 中进行了 8 次比较,依此类推。在每 8 或 9 次比较中,我们只能交换元素。

            在选择排序中,我们首先找到所有元素中的最小元素并将其放置在元素的 0 索引处。

            两种算法的复杂度都是 O(n2),但在最坏的情况下冒泡排序的复杂度为 O(n2),选择的复杂度为 O(n2),最好的情况下冒泡排序的复杂度为 O(n),选择排序的复杂度为有 O(n2)

            【讨论】:

              猜你喜欢
              • 2015-02-14
              • 2016-05-28
              • 2016-11-01
              • 2015-09-16
              • 2012-10-04
              • 2015-04-25
              • 2019-02-26
              相关资源
              最近更新 更多