【问题标题】:Which one is bubble sort?哪一种是冒泡排序?
【发布时间】:2016-09-06 21:19:44
【问题描述】:

第一个:

for(int i=0;i<n-1;i++)
  for(int j=n-1; j>i;j--)
    if(a[j] < a[j-1])
        swap(a[j], a[j-1]);

或第二个:

for(int i=0; i<n-1; i++)
  for(int j=i+1; j<n; j++)
    if(a[j] < a[i])
        swap(a[j],a[i]);

或第三版:

int temp, i, j = 0;
    boolean swaped = true;

    while (swaped) {
        swaped = false;
        j++;
        for(i = 0; i < arr.length - j; i++){
            if(arr[i] > arr[i+1]){
                temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
                swaped = true;
            }
        }
    }

有人说第一个,有人说第二个。那么哪一个是对的呢?有人说第二种是交换排序。很多书说冒泡排序是第三版,但很多人称第一版是冒泡排序。有什么意见吗?

【问题讨论】:

  • 第三版 - 有点奇怪。它甚至排序吗?
  • @MichaelDorgan:这是冒泡排序的常见优化
  • 猜猜我很久以前就停止使用它了 :) 我想知道为什么?
  • Selection sortInsertion sortBubble sort 上查看维基百科。经过审查,我认为第一个对应于插入排序(递减循环表明如果要信任维基百科),而第二个是冒泡排序。我确信它们都不是选择排序。交换比选择排序更多。
  • 在这么多人已经给出答案之后,您不应该更改问题。

标签: c algorithm sorting bubble-sort


【解决方案1】:

第一个版本是冒泡排序,因为它比较每对相邻的项目。

第二个版本是选择排序,因为a[i] 在每次外循环迭代后最终成为数组未排序右侧部分中的最小项。

【讨论】:

  • 您确定其中任何一个都是选择排序吗?我认为选择排序会遍历数组的未排序部分,找到最小的元素并将其移动到未排序部分的开头,然后将未排序部分的大小减一。
  • @JonathanLeffler 不太一样。状态与每次外部迭代的选择排序相同,但有一些额外的冗余交换。它仍在寻找最小的元素,但它会多次交换迄今为止找到的最小元素,而不是最后一次。我认为它可能是一些冒泡排序变体,但我认为冒泡排序需要交换相邻元素。
  • 有一个“我不太清楚我为什么会被打扰”的元素(因为它们都很慢而且不是特别有用),但也有一个“我喜欢它”的元素是正确的”。您将在 cmets 中看到主要问题,我认为第一个是插入排序,第二个是冒泡排序,第三个是修改的冒泡排序。我仍然认为没有一个是选择排序。请参阅我的 cmets 中针对该问题引用的 Wikipedia 文章。 (我在第一个 cmets 中也弄错了——我不是在这里声称完美!)
  • @JonathanLeffler 至于第一个算法,插入排序的想法需要在第一个算法不做的已经排序的部分中插入一个项目。
  • @JonathanLeffler 我同意 fgb,拳头不能是插入排序。它是冒泡排序,因为它交换相邻元素。插入排序的思想是我们保持数组的左边部分排序,并从右边取出元素并将其插入到左边部分的适当位置。就像你玩纸牌游戏时,每个玩家得到 13 张牌,玩家为了方便起见,将它们按排序顺序保存在手中。为此,该玩家选择 1 张未排序的卡片并将其放入已排序的中间(左、右)列表卡片中。
【解决方案2】:

我在 IntelliJ 中使用 Java 在实际数组上测试了您的代码 sn-ps。两个版本都按升序生成了一个数组。

这是我使用的数组:

int[] a = {1, 9, 3, 5, 4, 2, 8, 6, 7};

这是两个版本的输出:

版本 1

[1, 2, 3, 4, 5, 6, 7, 8, 9]

第 2 版

[1, 2, 3, 4, 5, 6, 7, 8, 9]

第一个版本看起来像标准的冒泡排序,而第二个版本似乎是别的东西。

【讨论】:

    【解决方案3】:

    1.第一个:

    for(int i=0;i<n-1;i++)
      for(int j=n-1; j>i;j--)
        if(a[j] < a[j-1])
            swap(a[j], a[j-1]);
    

    这是冒泡排序

    2.第二个:

    for(int i=0; i<n-1; i++)
      for(int j=i+1; j<n; j++)
        if(a[j] < a[i])
            swap(a[j],a[i]);
    

    选择排序

    尽管乍一看它会给人一种相反的冒泡排序实现的印象,但事实并非如此。正如其他用户已经指出的那样,它是 selection 排序

    3.第三版:

    int temp, i, j = 0;
        boolean swaped = true;
    
        while (swaped) {
            swaped = false;
            j++;
            for(i = 0; i < arr.length - j; i++){
                if(arr[i] > arr[i+1]){
                    temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                    swaped = true;
                }
            }
        }
    

    这实际上是增强的冒泡排序 这将改善最佳情况

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      相关资源
      最近更新 更多