Java常用排序算法及性能测试集合
本文导语: 现在再回过头理解,结合自己的体会, 选用最佳的方式描述这些算法,以方便理解它们的工作原理和程序设计技巧。本文适合做java面试准备的材料阅读。 先附上一个测试报告: Array length: 20000bubbleSort : 766 msbubbleSortAdvanced : 662 ...
现在再回过头理解,结合自己的体会, 选用最佳的方式描述这些算法,以方便理解它们的工作原理和程序设计技巧。本文适合做java面试准备的材料阅读。
先附上一个测试报告:
Array length: 20000
bubbleSort : 766 ms
bubbleSortAdvanced : 662 ms
bubbleSortAdvanced2 : 647 ms
selectSort : 252 ms
insertSort : 218 ms
insertSortAdvanced : 127 ms
insertSortAdvanced2 : 191 ms
binaryTreeSort : 3 ms
shellSort : 2 ms
shellSortAdvanced : 2 ms
shellSortAdvanced2 : 1 ms
mergeSort : 3 ms
quickSort : 1 ms
heapSort : 2 ms
通过测试,可以认为,冒泡排序完全有理由扔进垃圾桶。它存在的唯一理由可能是最好理解。希尔排序的高效性是我没有想到的;堆排序比较难理解和编写,要有宏观的思维。
package algorithm.sort;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Date;
/**
* Java常用排序算法及性能测试集合
*
* 本程序集合涵盖常用排序算法的编写,并在注释中配合极其简单的特例讲解了各种算法的工作原理,以方便理解和吸收;
* 程序编写过程中吸收了很多维基百科和别人blog上面的例子,并结合自己的思考,选择并改进一个最容易让人理解的写法
*(尤其是快速排序,我觉得我写的算法最好理解)。
* 同时包含一个集中式的性能测试和正确性测试方法,方便观测。
* @author /link.php?url=http://blog.csdn.net/sunxing007
* 转载请注明来自/link.php?url=http://blog.csdn.net/sunxing007
*/
public class SortUtil {
// 被测试的方法集合
static String[] methodNames = new String[]{
"bubbleSort",
"bubbleSortAdvanced",
"bubbleSortAdvanced2",
"selectSort",
"insertSort",
"insertSortAdvanced",
"insertSortAdvanced2",
"binaryTreeSort",
"shellSort",
"shellSortAdvanced",
"shellSortAdvanced2",
"mergeSort",
"quickSort",
"heapSort"
};
public static void main(String[] args) throws Exception{
//correctnessTest();
performanceTest(20000);
}
/**
* 正确性测试
* 简单地测试一下各个算法的正确性
* 只是为了方便观测新添加的算法是否基本正确;
* @throws Exception 主要是反射相关的Exception;
*/
public static void correctnessTest() throws Exception{
int len = 10;
int[] a = new int[len];
for(int i=0; i