排序算法总结

本文总结了排序算法的分类,包括稳定性、时间复杂度等综合分析,并探讨了JDK1.7中所使用的排序算法,对理解和应用排序算法提供了深入理解。
摘要由CSDN通过智能技术生成

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的具体实现参考:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值