排序算法的比较与选择

1、插入排序:简单,时间复杂度O(n2),每次保证前n个元素有序然后将n+1个元素插入到前面的序列中。

      可以证明:通过交换相邻元素进行排序的任何算法平均都需要O(n2)时间。所以提高插入排序的一种思路就是通过比较不相邻的元素进行排序,这就是希尔排序。

2、希尔排序:通过比较不相邻的元素来工作,各趟比较所使用的距离逐渐减小,称为增量序列。

      不同增量序列对算法性能影响很大。一种简单的增量序列是n/2n/4、、、1Hibbard序列效果较好(1,3,7、、,相邻增量没有公因子),最坏的时间复杂度为O(n3/2)

3、有时不需要对所有元素都排序,只需要知道最大或最小即可,此时堆作为一种优先队列是最佳选择。

      堆分为大顶堆和小顶堆。建堆时间复杂度为O(n),所谓的堆排序是从建好堆之后开始算的:每次取走堆顶元素,然后将最后一个元素放在堆顶并重新建堆,时间复杂度为O(nlogn)。由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。

4、归并排序所需的比较次数是最少的O(nlogn):每次最多需要n-1次比较,经过logn轮归并后即可得到排序结果,在java中元素比较的开销较大,所以java类库中泛型排序一般就是用归并排序。

5、快速排序类似于二分查找是一种分治的思想,每次都会有一个元素进入其最终位置。在快排中,枢轴的选择十分关键。无知的选择是将第一个作为枢轴,如果待排元素是预排序的性能会很差。一种安全的做法是随机选取。选取首尾和中间元素的中值作为枢轴也是不错的选择。

参考:

1、建堆的过程:http://www.educity.cn/ky/sjjg/200812241135541065.htm

2、百度百科-堆排序:http://baike.baidu.com/view/157305.htm

3、白话经典算法系列之七堆与堆排序:http://blog.csdn.net/morewindows/article/details/6709644

4、建堆时间复杂度证明:http://hi.baidu.com/andey0307/item/2c6cf7f14abf8cc6a935a261

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值