【Java】七大基础排序算法-效率测试

本文通过测试程序对比分析了冒泡排序、选择排序、插入排序、折半插入排序、堆排序、希尔排序、归并排序、随机快排和三路快排等算法在处理不同规模和类型数据时的效率,揭示了各种排序算法在实际应用中的性能差异。

【Java】七大基础排序算法-效率测试


前言

这些排序算法到底有什么差别?出于好奇,所以进行了本次测试。
前面几篇文章总结了七大排序的原理、写法以及优化方法,这篇文章我将利用一个简单的测试程序来对这些排序算法的效率进行一个对比测试。其中排序算法和测试程序都总结在往期文章里。🚀


一、测试对象

⚠️点击小火箭查看程序的具体实现

🚀冒泡排序(bubbleSort)
🚀基础选择排序(selectionSort)
🚀双向选择排序(selectionSortBP)
🚀基础插入排序(insertionShort)
🚀折半插入排序(insertionShortHalf)
🚀堆排序(heapSort)
🚀希尔排序(shellSort)
🚀归并排序(mergeSort)
🚀随机快排(quickSort1)
🚀三路快排(quickSort3)


二、测试程序与数据

⚠️点击小火箭查看程序具体实现🚀

        //n表示需要生成的数组长度
        int n = 1000;
        //生成一个长度为n的近乎有序数组 times的值越小数组越有序
        //times==0 表示生成的就是一个有序数组
        int[] arr1 = Helper.generateSoredArray(n, 5);
        //生成一个长度为n的随机且无大量重复值的数组
        int[] arr2 = Helper.generateRandomArray(n, 0, Integer.MAX_VALUE);
        //生成一个长度为n的随机且含大量重复值的数组 [left,right)区间越小重复值越多
        //若区间为[0,1),则生成值全为0的数组
        int[] arr3 = Helper.generateRandomArray(n, 0, 5);

⚠️通过改变测试程序里的参数,可以生成不同形式和规模的数据,以便我们更全面的测试

使用以下三种数据形式作为测试用例:
	1. 近乎有序的数组;
	2. 随机且不含大量重复值数组
	3. 随机且包含大量重复值数组
本次测试数据规模选取比较极端

三、测试过程

🔵一共测试了10组数组,每一轮测试都给出了排名表,对比结果非常直观

1️⃣数组长度为 1千

数据初始化:

        //数组长度n
        int n = 1000;
        //生成一个近乎有序数组,times的值越小,数组越有序
        int[] arr1 = Helper.generateSoredArray(n, 3);
        //生成一个随机且无大量重复值的数组
        int[] arr2 = Helper.generateRandomArray(n, 0, Integer.MAX_VALUE);
        //生成一个随机且包含大量重复值的数组,[left,right)包含区间越小重复值越多
        int[] arr3 = Helper.generateRandomArray(n, 0, 5);

测试结果:
在这里插入图片描述

🔵数据量虽然少,但是也能明显的看到不同算法的执行时间差别还是比较大的,继续往下看!


2️⃣数组长度为 5千

数据初始化:

        //数组长度n
        int n = 5000;
        //生成一个近乎有序数组,times的值越小,数组越有序
        int[] arr1 = Helper.generateSoredArray(n, 5);
        //生成一个随机且无大量重复值的数组
        int[] arr2 = Helper.generateRandomArray(n, 0, Integer.MAX_VALUE);
        //生成一个随机且包含大量重复值的数组,[left,right)包含区间越小重复值越多
        int[] arr3 = Helper.generateRandomArray(n, 0, 5);

测试结果:
在这里插入图片描述


3️⃣数组长度为 1万

数据初始化:

        //数组长度n
        int n = 10000;
        //生成一个近乎有序数组,times的值越小,数组越有序
        int[] arr1 = Helper.generateSoredArray(n, 10);
        //生成一个随机且无大量重复值的数组
        int[] arr2 = Helper.generateRandomArray(n, 0, Integer.MAX_VALUE);
        //生成一个随机且包含大量重复值的数组,[left,right)包含区间越小重复值越多
        int[] arr3 = Helper.generateRandomArray(n, 0, 10);

测试结果:
在这里插入图片描述


4️⃣数组长度为 2万

数据初始化:

        //数组长度n
        int n = 20000;
        //生成一个近乎有序数组,times的值越小,数组越有序
        int[] arr1 = Helper.generateSoredArray(n, 10);
        //生成一个随机且无大量重复值的数组
        int[] arr2 = Helper.generateRandomArray(n, 0, Integer.MAX_VALUE);
        //生成一个随机且包含大量重复值的数组,[left,right)包含区间越小重复值越多
        int[] arr3 = Helper.generateRandomArray(n, 0, 10);

测试结果:
在这里插入图片描述


5️⃣数组长度为 5万

数据初始化:

        //数组长度n
        int n = 50000;
        //生成一个近乎有序数组,times的值越小,数组越有序
        int[] arr1 = Helper.generateSoredArray(n, 10);
        //生成一个随机且无大量重复值的数组
        int[] arr2 = Helper.generateRandomArray(n, 0, Integer.MAX_VALUE);
        //生成一个随机且包含大量重复值的数组,[left,right)包含区间越小重复值越多
        int[] arr3 = Helper.generateRandomArray(n, 0, 10);

测试结果:
在这里插入图片描述

🔵随着数据量增大,冒泡排序处理随机不重复数组和重复数组的速度已经不行了,下一轮该淘汰了!


6️⃣数组长度为 10万

数据初始化:

        //数组长度n
        int n = 10000;
        //生成一个近乎有序数组,times的值越小,数组越有序
        int[] arr1 = Helper.generateSoredArray(n, 10);
        //生成一个随机且无大量重复值的数组
        int[] arr2 = Helper.generateRandomArray(n, 0, Integer.MAX_VALUE);
        //生成一个随机且包含大量重复值的数组,[left,right)包含区间越小重复值越多
        int[] arr3 = Helper.generateRandomArray(n, 0, 10);

测试结果:
在这里插入图片描述

🔵冒泡排序以及选择排序的两种算法在本轮测试中速度都比较慢,下轮都淘汰!


7️⃣数组长度为 20万

数据初始化:

        //数组长度n
        int n = 200000;
        //生成一个近乎有序数组,times的值越小,数组越有序
        int[] arr1 = Helper.generateSoredArray(n, 20);
        //生成一个随机且无大量重复值的数组
        int[] arr2 = Helper.generateRandomArray(n, 0, Integer.MAX_VALUE);
        //生成一个随机且包含大量重复值的数组,[left,right)包含区间越小重复值越多
        int[] arr3 = Helper.generateRandomArray(n, 0, 50);

测试结果:
在这里插入图片描述

🔵插入排序在处理近乎有序数组时速度居榜首,但是处理其他两种数组时效果欠佳,下轮淘汰!


8️⃣数组长度为 50万

数据初始化:

        //数组长度n
        int n = 500000;
        //生成一个近乎有序数组,times的值越小,数组越有序
        int[] arr1 = Helper.generateSoredArray(n, 50);
        //生成一个随机且无大量重复值的数组
        int[] arr2 = Helper.generateRandomArray(n, 0, Integer.MAX_VALUE);
        //生成一个随机且包含大量重复值的数组,[left,right)包含区间越小重复值越多
        int[] arr3 = Helper.generateRandomArray(n, 0, 100);

测试结果:
在这里插入图片描述


9️⃣数组长度为 100万

数据初始化:

        //数组长度n
        int n = 1000000;
        //生成一个近乎有序数组,times的值越小,数组越有序
        int[] arr1 = Helper.generateSoredArray(n, 60);
        //生成一个随机且无大量重复值的数组
        int[] arr2 = Helper.generateRandomArray(n, 0, Integer.MAX_VALUE);
        //生成一个随机且包含大量重复值的数组,[left,right)包含区间越小重复值越多
        int[] arr3 = Helper.generateRandomArray(n, 0, 100);

测试结果:
在这里插入图片描述

🔵本轮测试中,随机快排在处理随机含大量重复值的数组时,相对于其他算法速度极慢,而且还可能出现栈溢出问题,不能留了,淘汰!
🔵基础插入排序在处理近乎有序数组时,一直位居榜首,非常厉害!
🔵快速排序在处理近乎有序数组时,速度稍微差了一点点,但是处理另外两种数组时各居榜首,也很厉害!


🔟终极测试:数组长度为 700万

🔵由于内存问题,只能测试到这了

数据初始化:

        //数组长度n
        int n = 7000000;
        //生成一个近乎有序数组,times的值越小,数组越有序
        int[] arr1 = Helper.generateSoredArray(n, 60);
        //生成一个随机且无大量重复值的数组
        int[] arr2 = Helper.generateRandomArray(n, 0, Integer.MAX_VALUE);
        //生成一个随机且包含大量重复值的数组,[left,right)包含区间越小重复值越多
        int[] arr3 = Helper.generateRandomArray(n, 0, 100);

测试结果:
在这里插入图片描述

🔵本轮测试希尔排序处理随机不重复数组的效率已经不行了,淘汰!
🔵排序算法被广泛应用是有原因的,数据量较大时,排序算法在三种数据处理周都位居榜一


总结

🔵测到最后,留下来的几种算法在处理大量数据时,处理时间上相差还是比较大的,但是应该都在我们能接受的范围之内;
🔵不同的算法在应对不同的数据规模和形式的时候性能都会有变化,总有一种适合处理的数据集;
🔵面对实际情况,我们需要对症下药,选择合适的算法。

这些排序算法到底有什么差别?完全出于好奇,进行了本次测试,如内容有任何不妥,恳请指正!

一.使用USB串口连接线(打印机线) 1.选用串口连接线(电子电脑市场容易购买), 长度不超过15米。 USB线驱动安装,安装完毕,重新启动电脑,在控制面板/硬件/COM/可以看到USB连线,末端显示COM号,如COM6。 2.连接效果器和PC机,正常打开页面,会自动搜索COM。 3.点击DSP9.01.exe软件,打开PC界面软件自动搜索COM号,调取机器数据。 4.如不能连接,请检查USB连接线是否正常、COM端口号是否正确、效果器是否开机、 软件是否设定连接状态。 使用USB连线时,如果暂时不能连接,需拔去USB线,重新插入PC,再点击连接。二.效果器与PC连接成功,效果器屏幕显示PC COM,此时面板按键和遥控器不能使用,若要使用 请在界面点击断开连接或关闭PC界面,必须在关闭PC界面后方可拔去连接线。三.如果不能打开界面,电脑需要安装Microsoft NET4.0,在安装目录下存放了NET4.0(某种情况 下可能需要网络连接下安装),点击安装后,再重新打开DSP9.01软件。四.为什么打开DSP9.01界面但与机器连接不上?或安装USB驱动提示失败? 因为电脑曾经安装过USB驱动,新的安装不法覆盖。解决方法如下: 1.打开机器电源,与电脑连好USB连线。 2.我的电脑-电脑硬件-找到识别的COM口(CH341),按右件更新USB驱动,指向DSP软件USB 驱动目录即可。如果找不到COM,可拨出USB线,重新插入,再次查找COM并更新USB驱动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值