排序算法的比较与选择

来源:互联网 发布:mac如何接受共享日历 编辑:程序博客网 时间:2024/05/16 14:57

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

原创粉丝点击