【问题标题】:Recursive BubbleSort vs normal BubbleSort递归冒泡排序与普通冒泡排序
【发布时间】:2013-10-09 01:20:11
【问题描述】:

我编写了 2 个冒泡排序算法。一种是没有递归的,另一种是有递归的。我很想知道这两者中哪一个更有效,并解释为什么。

递归冒泡排序:

private static int list[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};

public int[] recursiveBubble(int[] args, int startIndex, int endIndex) {
    if(startIndex > endIndex){
        System.out.println("Recursive bubblesort:");
        System.out.println(Arrays.toString(args));
        return args;
    }

    if (startIndex == endIndex - 1) {
        recursiveBubble(args, 0, endIndex - 1);
    } else if (args[startIndex] > args[startIndex+1]) {
        int currentNumber = args[startIndex];
        args[startIndex] = args[startIndex + 1];
        args[startIndex + 1] = currentNumber;

        recursiveBubble(args, startIndex + 1, endIndex);
    } else  {
        recursiveBubble(args, startIndex + 1, endIndex);
    } 
    return args;
}

使用循环的冒泡排序:

 public int[] bubblesort(int[] args) {
    System.out.println("Normal BubbleSort:");
    for (int j = 0; j < args.length; j++) {
        for (int i = 0; i < args.length; i++) {
            int currentNumber = args[i];
            if (i + 1 < args.length) {
                if (currentNumber > args[i + 1]) {
                    args[i] = args[i + 1];
                    args[i + 1] = currentNumber;
                }
            }
        }
    }
    System.out.println(Arrays.toString(args));
    return args;
}

【问题讨论】:

  • 这不是此类问题的论坛 - 请尝试Code Review
  • @SimonArsenault 值得注意的是 javac 不做尾递归优化,而且上述方法在任何情况下都不是尾递归。
  • @Boris 我发布的链接有很多适合 Java 的答案。
  • 有什么理由不能只对它们进行基准测试吗?

标签: java algorithm sorting recursion bubble-sort


【解决方案1】:

我不确定您的意思是哪个更好,但根据算法的工作方式,冒泡排序本质上必须具有最佳和最差情况的执行时间。最佳情况 O(n) 最坏情况 O(n^2) 请参阅 http://en.wikipedia.org/wiki/Bubble_sort 。迭代与递归不应该有太大的区别。我想递归会占用更多的堆栈内存。递归往往比迭代更难编写和跟踪。由于如果两者都是实际的冒泡排序实现,则没有时间优势,我会坚持迭代。

【讨论】:

  • 好吧,基本上我的意思是哪个跑得最快。由于我无法在 netbeans 上找到运行时。它只会说0秒。所以我只想知道在运行时哪个实现目标最快。
  • 虽然你是对的,最好情况和最坏情况下算法的性能往往不会改变。
  • 如果您的编码正确,差异应该可以忽略不计。尝试在庞大的数据集上运行它并进行分析,但我会惊讶地发现有很大的不同。这是作业吗? stackoverflow.com/questions/895371/bubble-sort-homework?rq=1
  • 不,这只是我在业余时间尽可能多地练习 Java。这也是我第一次使用递归,哈哈。很高兴它正在工作。 :D
  • 更好的练习方法可能是查找阶乘或实现二叉搜索树并进行搜索。树结构搜索和解析是递归的常见用途,也是我在工作中所做的事情。或固有的递归排序,如归并排序
【解决方案2】:

在上面的示例中,您将循环替换为递归的次数更少。在 java 中,递归版本可能不好,因为它可能导致基于长数组长度的 stackoverflow 错误。 复杂性方面我看不出有什么区别。如果您比较 JVM 的内存管理,那么递归版本将比您的正常循环占用更多的内存空间。如果您增加变量的长度,您可能会注意到这种差异,或者您可能会遇到基于内存代分配大小的 stackoverflow 异常。

【讨论】:

    猜你喜欢
    • 2012-05-28
    • 1970-01-01
    • 2013-12-02
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2011-12-09
    • 2013-11-29
    相关资源
    最近更新 更多