【问题标题】:Bidirectional Bubble Sort双向冒泡排序
【发布时间】:2014-07-23 19:47:06
【问题描述】:

我必须解决以下问题。所以最初我有一个冒泡排序,现在我对其进行了修改以使其成为双向。以下是我的解决方案。

public void bubbleSort() {
    int temp;
    int out;
    int outNew = 0;
    int in;

    for (out = nElems - 1; out > outNew; out--) {

        for (in = 0; in < out; in++) {

            if (a[in] > a[in + 1]) {
                temp = a[in + 1];
                a[in + 1] = a[in];
                a[in] = temp;
            }
        }

        for (int j = in - 1; j > outNew; j--) {

            if (a[j] < a[j - 1]) {
                temp = a[j];
                a[j] = a[j - 1];
                a[j - 1] = temp;
            }

        }

        outNew++;

    }

}

当我调用冒泡排序对我创建的数组中的几个随机数进行排序时,它似乎排序正常。我的问题是针对所有开发人员,我的解决方案是否满足上面发布的问题,以及我可以做些什么不同的事情来使这个解决方案更有效(如果可能的话)。如果这是一个开放的问题,我很抱歉,我通常在这里寻找提示和建议而不是代码,因为它可以帮助我更好地学习。我感谢所有答案,并对任何建议持开放态度。

【问题讨论】:

    标签: java algorithm sorting bubble-sort


    【解决方案1】:

    您的第一个内部循环似乎有点低效,因为您的数组将在两端部分排序。在第一轮之后(一次增加索引,一次减少它)第一个和最后一个元素已经是正确的,因此不需要从索引 0 开始(并且任务/练习需要顺便说一句)。

    以下 ASCII 艺术演示,算法应在具有 9 个元素的数组示例中对哪些索引进行操作(包括使用in+1j-1 达到的索引;应考虑| 之间的所有索引):

    position:   0    1    2    3    4    5    6    7    8
    ------------------------------------------------------------
              |                   ->                       |
              |                   <-                 |
                   |              ->                 |
                   |              <-             |
                        |         ->             |
                        |         <-        |
                             |    ->        |
                             |    <-   |
    

    但是你的算法所做的是:

    position:   0    1    2    3    4    5    6    7    8
    ------------------------------------------------------------
              |                     ->                     |
              |                     <-                     |
              |                     ->                |
                   |                <-                |
              |                     ->           |
                        |           <-           |
              |                     ->      |
                             |      <-      |
    

    您必须修复第一个内部 for 循环的初始索引。

    【讨论】:

    • 哦,我明白你对我的内部循环的意思了,所以如果我设置我的 in = outNew ,那会解决效率低下的问题,对吧?外循环有什么问题?
    • @user2733436:对不起,我的错,我以为是out &gt; 0
    • 很抱歉,这是我第一次发布它的时候,但我发现这是一个错误,所以我编辑并修复了它。我猜你可能在我编辑它之前看到了我的代码:)。
    【解决方案2】:

    简而言之,我认为您不能同时更有效地回答问题。非常明确的一点是,您必须将您的物品向右搬运,直到找到一个较小的,然后将其取到比您携带的最后一个略小的那个并将其提起。我认为常规的单向冒泡排序不会带来任何性能提升,但如果你要让它成为双向的,那么这就是实现它的方法。

    你怎么知道?好吧,因为没有性能增益/下降,左->右代码和右->左代码应该是完全对称的(因为它们在性能方面是相同的)。在你的情况下,有所以我会说它看起来不错。

    想得更深一点,可能会从双向获得一些轻微的优化,只是因为你得到了一个你刚刚看过的项目,所以你知道你可以从它的初始位置向左移动,跳过右侧数组。但最终,它可以忽略不计,无论您如何切片,它仍然是 O(n²) 性能。

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 2014-02-04
      • 2022-01-09
      • 2017-03-23
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多