为什么随机排序的两种实现在性能上有很大差异?

时间:2015-11-26 23:47:56

标签: java sorting random

我需要实现一个随机排序,这在性能方面非常差,但习惯于习惯于随机生成:

我有两个实现:

public void sort(Integer[] a) {
    boolean sorted = false;
    boolean auxSorted = true;
    List<Integer> list = Arrays.asList(a);
    int n = a.length;

    while (sorted == false) {
        Collections.shuffle(list);

        int i = 0;
        while (i < n-1 && list.get(i) <= list.get(i + 1)) {
            i = i + 1;
        }
        if (i == n - 1) {
            sorted = true;
        }
    Integer[] sortedArray = new Integer[list.size()];
    a = list.toArray(sortedArray);
}

当我使用长度为5的数组时,它会很快给出正确的答案, 但是我有另一个for循环版本:

while (sorted == false) {
        Collections.shuffle(list);

        for(int i = 0; i < n-1; i++) {
            if(list.get(i) > list.get(i+1)) {
                auxSorted = false;
                break;
            }
        }

        if(auxSorted) {
            sorted = true;              
        }

    }

当我使用相同的阵列进行测试时,它的运行速度非常慢。

两种实现之间是否存在差异?对我来说,我认为for循环版本在这种情况下实际上更有效。

1 个答案:

答案 0 :(得分:0)

在第二个中,您从未将auxSorted设置为true,因此您永远无法使sorted成为真。这意味着你的循环无限运行。这确实很慢。

while (!sorted) {
    Collections.shuffle(list);

    auxSorted = true; //You need this

    for(int i = 0; i < n-1; i++) {
        if(list.get(i) > list.get(i+1)) {
            auxSorted = false;
            break;
        }
    }

    if(auxSorted) {
        sorted = true;              
    }
}

你说第二个实现比第一个实现效率更高是正确的,但问题仍然是你为什么要在你随机生成某个东西或排序某些东西时想要这样做。因为这是一种非常低效的方式。