这两个冒泡排序实现之间的差异

时间:2013-11-10 06:56:36

标签: java sorting bubble-sort

我有两个冒泡排序的实现,但其中一个工作正常,另一个不能解释我这两个有什么区别

第一个这很好用

private static int[] sortBuble(int[] a) {
        boolean swapped = true;
        for (int i = 0; i < a.length && swapped; i++) {
            swapped = false;
            System.out.println("number of iteration" + i);

            for (int j = 1; j < a.length; j++) {

                if (a[j - 1] > a[j]) {
                    int temp = a[j - 1];
                    a[j - 1] = a[j];
                    a[j] = temp;
                    swapped = true;
                }
            }
        }

        return a;
    }

第二个这不起作用,但看起来或多或少相同

private static int[] sortBuble1(int[] a) {
        boolean swapped = true;
        for (int i = 0; i < a.length && swapped; i++) {
            swapped = false;
            System.out.println("number of iteration" + i);

            for (int j = i + 1; j < a.length; j++) {

                if (a[i] > a[j]) {
                    int temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                    swapped = true;
                }
            }
        }

        return a;
    }

2 个答案:

答案 0 :(得分:3)

他们不一样。在第二个示例中,对于inner-for循环的每次迭代,我都保持不变,并使用a[i]进行比较,这是不正确的。正如我在其他答案中所说,第一个也是效率低下的。以下是第一个的优化版本:

private static int[] bubblesort(int[] nums)
{
    boolean done = false;

    for (int i = 0;  i < nums.length && !done; i++)
    {
        done = true;

        for (int j = nums.length-1; j > i; j--)
        {
            if (nums[j] < nums[j-1])
            {
                int temp = nums[j];
                nums[j] = nums[j-1];
                nums[j-1] = temp;
                done = false;
            }
        }
    }

    return nums;
}

在i th 迭代结束时,我们知道第一个i元素已经排序,因此我们不再需要查看它们了。我们需要布尔值来确定是否需要继续。如果没有互换,那么我们就完成了。我们可以删除布尔值,它仍然可以工作,但效率会降低。

答案 1 :(得分:1)

不同之处在于用于数组的索引。

在第一种情况下,for的内部j循环与i无关。此外,您在交换时使用j的相邻值,以便始终在数组中交换相邻值。

在第二种情况下,您的内部for循环从j开始i + 1。并且您使用ij来索引数组。所以你实际上并没有比较相邻的元素,而是相距很远的元素(例如,当i=1j=4时)。这不是冒泡排序,这种算法不会那样工作。

相关问题