(java)为什么冒泡排序不排序?

时间:2014-12-10 04:04:41

标签: java sorting

我计划进行排序马拉松,我会查找常见排序算法的伪代码,并尝试用Java实现它们。

我尝试的第一个是bubblesort。我写了最简单的表格似乎工作正常:

package bubblesort;

public class Sort {

    private static void swapElements(int[] array, int index1, int index2) {
        int holder = array[index1];
        array[index1] = array[index2];
        array[index2] = holder;

    }

    public static void ascending(int[] array) {

        boolean sorted = false;
        while(!sorted) {
            sorted = true; //if no elements are swapped, 'sorted' remains equal to true and the while-loop ends.

            for(int i = 0; i < array.length - 1; i++) {
                if(array[i] > array[i + 1]) {
                    swapElements(array, i, i + 1);
                    sorted = false;
                }
            }

        }
    }


}

然而,由于每次执行for循环时最高值都被带到最后一个元素,我试图通过在结尾省略元素来改进它,引入一个新变量来计算整个数组的次数。检查:

package bubblesort;

public class Sort {

    private static void swapElements(int[] array, int index1, int index2) {
        int holder = array[index1];
        array[index1] = array[index2];
        array[index2] = holder;

    }

    public static void ascending(int[] array) {

        int timesLooped = 0;
        boolean sorted = false;
        while(!sorted) {
            sorted = true;

            for(int i = 0; i < array.length - timesLooped - 1; i++) {
                if(array[i] > array[i + 1]) {
                    swapElements(array, i, i + 1);
                    sorted = false;
                }
                timesLooped++;
            }

        }
    }


}

这次排序失败;只有阵列中的某些元素被排序,其他元素不会被排除。

所以我的问题是:我介绍&#39; timesLooped&#39;的方式有什么问题?试图避免进行不必要的比较的变量?

1 个答案:

答案 0 :(得分:3)

timesLopped++应位于for循环之外:

    public static void ascending(int[] array) {

        int timesLooped = 0;
        boolean sorted = false;
        while(!sorted) {
            sorted = true;

            for(int i = 0; i < array.length - timesLooped - 1; i++) {
                if(array[i] > array[i + 1]) {
                    swapElements(array, i, i + 1);
                    sorted = false;
                }
            }
            timesLooped++;              
        }
    }