基本插入排序优化使代码变慢

时间:2015-03-13 07:23:53

标签: java algorithm sorting insertion-sort

我明天将在Insertion Sort上教一个演示。一个重要的优化是在内部循环中添加一个检查,以便在项目进入正确位置后停止迭代。所以基本上,它是从这个:

public static void insertionSort(int[] array) {
    for (int i = 0; i < array.length; i++) {
        for (int j = i; j > 0; j--) {
            if (array[j] < array[j-1]) {
                int tmp = array[j];
                array[j] = array[j-1];
                array[j-1] = tmp;
            }
        }
    }
}

到此:

public static void insertionSort(int[] array) {
    for (int i = 0; i < array.length; i++) {
        for (int j = i; j > 0 && array[j] < array[j-1]; j--) {
            int tmp = array[j];
            array[j] = array[j-1];
            array[j-1] = tmp;
        }
    }
}

第二个版本应该更有效率。但是,当我对它进行基准测试时,我实际上测量第一个版本的性能更快。我无法找到错误。有什么想法会发生什么?

这是我用来进行基准测试的代码:

import java.util.Arrays;
import java.util.Random;

public class InsertionSort {
    public static void main(String[] args) {
        int[] stuff = getRandomArray(50000);
        //System.out.println(Arrays.toString(stuff));

        long started = System.currentTimeMillis();
        insertionSort(stuff);
        long finished = System.currentTimeMillis();
        long totalTime = finished - started;

        //System.out.println(Arrays.toString(stuff));

        System.out.println("Started: " + started);
        System.out.println("Finished: " + finished);
        System.out.println("Elapsed: " + totalTime);
    }

    public static int[] getRandomArray(int size) {
        int[] array = new int[size];
        Random r = new Random();
        for (int i = 0; i < array.length; i++) {
            array[i] = r.nextInt(size);
        }
        return array;
    }

    public static void insertionSort(int[] array) {
        // Implementation goes here
    }
}

编辑:更改了测试数组中的项目数,并注释掉要打印的行

1 个答案:

答案 0 :(得分:3)

首先,你写了一个所谓的微基准。您的结果没有意义,因为您没有进行预热阶段。这对于让JVM HotSpot编译器执行其运行时优化至关重要。

搜索&#34; java microbenchmark&#34;找一些工具。一个例子是http://java-performance.info/jmh/

为了防止你的结果有意义,我想在你的第二个例子中,HotSpot编译器的循环优化不如你在第一个例子中那样有效。