高级排序 03 归并排序不一定比插入排序快

排序算法性能对比
本文通过实验对比了插入排序和归并排序在不同条件下的性能。结果显示,在处理随机数组时,归并排序表现更优;而在处理近乎有序的数组时,随着数组有序程度的提高,插入排序的性能逐渐优于归并排序。

结论

对于近乎有序的数组,插入排序的速度比归并排序还要快;

测试代码

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值