【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);
测试结果:

🔵本轮测试希尔排序处理随机不重复数组的效率已经不行了,淘汰!
🔵排序算法被广泛应用是有原因的,数据量较大时,排序算法在三种数据处理周都位居榜一
总结
🔵测到最后,留下来的几种算法在处理大量数据时,处理时间上相差还是比较大的,但是应该都在我们能接受的范围之内;
🔵不同的算法在应对不同的数据规模和形式的时候性能都会有变化,总有一种适合处理的数据集;
🔵面对实际情况,我们需要对症下药,选择合适的算法。
这些排序算法到底有什么差别?完全出于好奇,进行了本次测试,如内容有任何不妥,恳请指正!
本文通过测试程序对比分析了冒泡排序、选择排序、插入排序、折半插入排序、堆排序、希尔排序、归并排序、随机快排和三路快排等算法在处理不同规模和类型数据时的效率,揭示了各种排序算法在实际应用中的性能差异。

1万+

被折叠的 条评论
为什么被折叠?



