排序数组(冒泡排序)

时间:2015-11-10 06:19:40

标签: java arrays sorting

我在排序数组时有一点疑问,是的,我是编程的新手。看一下这段代码,例如:

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 < (array.length-j)作为测试表达式?我们可能宁愿使用i < (array.length)作为测试表达式,同时省略变量j。有什么答案吗?

1 个答案:

答案 0 :(得分:0)

“为什么我们必须使用j ++和i&lt;(array.length-j)作为测试表达式?”

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

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

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

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

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

算法的运行时间为n2/2O(n2)

正如你所说,我们可以使用i < (array.length - 1),但我们只会做很多工作。如果我们这样做,运行时间将是(n n),即O(n n)。但是虽然运行时间仍然是O(n * n)但很明显n2/2小于n2,因此第一个是有效的。

相关问题