003 归并排序(二)不一定比插入排序快

结论

  • 对于近乎有序的数组,插入排序的速度 O(n) 比归并排序 O(nlogn) 还要快;

测试代码

import util.SortTestHelper;

import java.util.Arrays;

public class Main {

    // 比较InsertionSort和MergeSort两种排序算法的性能效率
    // 整体而言, MergeSort的性能最优, 对于近乎有序的数组的特殊情况, 见测试2的详细注释
    public static void main(String[] args) {

        int N = 50000;

        // 测试1 一般测试
        System.out.println("Test for random array, size = " + N + " , random range [0, " + N + "]");

        Integer[] arr1 = SortTestHelper.generateRandomArray(N, 0, N);
        Integer[] arr2 = Arrays.copyOf(arr1, arr1.length);

        SortTestHelper.testSort("_03.sortingadvanced._02.InsertionSort", arr1);
        SortTestHelper.testSort("_03.sortingadvanced._02.MergeSort", arr2);

        System.out.println();


        // 测试2 测试近乎有序的数组
        // 对于近乎有序的数组, 数组越有序, InsertionSort的时间性能越趋近于O(n)
        // 所以可以尝试, 当swapTimes比较大时, MergeSort更快
        // 但是当swapTimes小到一定程度, InsertionSort变得比MergeSort快
        int swapTimes = 10;
        assert swapTimes >= 0;

        System.out.println("Test for nearly ordered array, size = " + N + " , swap time = " + swapTimes);

        arr1 = SortTestHelper.generateNearlyOrderedArray(N, swapTimes);
        arr2 = Arrays.copyOf(arr1, arr1.length);

        SortTestHelper.testSort("_03.sortingadvanced._02.InsertionSort", arr1);
        SortTestHelper.testSort("_03.sortingadvanced._02.MergeSort", arr2);

        return;
    }
}

输出:

Test for random array, size = 50000 , random range [0, 50000]
InsertionSort : 3636ms
MergeSort : 42ms

Test for nearly ordered array, size = 50000 , swap time = 10
InsertionSort : 3ms
MergeSort : 10ms
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容