【问题标题】:Sorting arrays (Bubble Sort)排序数组(冒泡排序)
【发布时间】:2016-02-10 23:32:45
【问题描述】:

我在对数组进行排序时有一点疑问,是的,我是编程新手。以这段代码为例:

public void bubbleSort(int[] array) {
boolean swapped = true;
int j = 0;
int tmp;
while (swapped) {
    swapped = false;
    j++;
    for (int i = 0; i < array.length - j; i++) {
        if (array[i] > array[i + 1]) {
            tmp = array[i];
            array[i] = array[i + 1];
            array[i + 1] = tmp;
            swapped = true;
        }
    }
}

在上面的代码中,为什么我们必须使用j++i &lt; (array.length-j)作为测试表达式?我们本可以使用i &lt; (array.length) 作为测试表达式,同时省略变量j。有答案吗?

【问题讨论】:

    标签: java arrays sorting


    【解决方案1】:

    “为什么我们必须使用 j++ 和 i

    背后的原因是任何时候元素 array[ array.length -j ]array[array.length - 1] 已经排序。


    示例:假设您有长度为n 的数组。

    所以在第一次迭代之后,最大的元素将被放置在array[n - 1]
    因此,由于最大元素已经在下一次迭代中排序,我们将只对长度为 n - 1 的数组进行排序。

    第二次迭代后,第二大元素将被放置在array[ n - 2]

    因此,因为第 1 大和第 2 大元素已经在下一次迭代中排序,我们将只对长度为 n - 2 的数组进行排序,依此类推...

    算法的运行时间为,即

    正如您所说,我们本可以使用i &lt; (array.length - 1),但我们将白白做很多工作。如果我们这样做,运行时间将是 (nn),即 O(nn)。但是虽然运行时间仍然是O(n*n),但是很明显小于,所以第一个是高效的。

    【讨论】:

    • 当我不考虑j时,我得到以下错误:
    • java.lang.ArrayIndexOutOfBoundsException: 6
    • 是的,很好地阅读了答案,我相信它会对您有很大帮助。是的,你必须使用i &lt; (array.length - 1)
    • 非常感谢!这真的很有帮助!
    • 您可能希望在星号前加一个反斜杠,以便显示而不是斜体。 (编辑太小,无法自行修复)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2023-03-28
    • 2014-06-20
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多