1.排序算法分类
基础的排序算法包含冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序及快速排序。
根据实现类型可分为插入排序类、选择排序类、交换排序类及归并排序类。
2.排序算法的综合分析
各算法的排序方式、平均情况、最好最坏情况、所需的辅助空间及稳定性如下:
事实上,排序算法没有十全十美,本来想写一套模拟测试的数据来验证孰优孰略。但是突然发现可比性不高,需要根据排序源的情况,选择合适的排序算法。
从平均情况来看,显然最后3种改进的算法要优于希尔排序及其他3种简单的排序算法
从最坏情况来看,堆排序与归并排序又强过快速排序及其他简单排序
从辅助空间来看,简单排序算法及堆排序算法最优
从稳定性来看,改进的排序算法只有归并排序最稳定
选择怎样的排序算法需要根据各项指标来综合考虑,从待排序的个数上来说,待排序的个数n越小,采用简单排序的方法越合适,反之n越大,采用改进排序方法越合适,例如当关键字本身信息量很大,暂用存储空间大,移动比较花费时间,此时简单排序算法比较有优势。当然如果需要考虑算法的稳定性,显然改进的算法中只有归并排序合适。当然如果一定要说那个排序算法比较好,从综合的情况来说,改进的排序算法显然更优。
3.JDK1.7中的排序算法
java的程序员都知道我们对排序经常使用Collections.sort()或者Arrays.sort(),当然Collections.sort()最后也是调用了Arrays.sort(),如下:
public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}
那个Arrays.sort(),到底使用什么排序的算法呢?
分析源码得知:
public static void sort(int[] a) {
DualPivotQuicksort.sort(a);
}
DualPivotQuicksort是一种在快速排序(单轴)上优化的排序算法,是一种双轴快排。该算法的实现印证了第2点中的描述,算法的选择根据了数据源的情况进行实现。DualPivotQuicksort的实现包含组合了 TimSort( 是一个归并排序做了大量优化的版本)、插入排序、单轴快速排序等。
有兴趣的深入了解DualPivotQuicksort的具体实现参考: