排序算法/查找算法总结

来源:互联网 发布:男士双肩包 知乎 编辑:程序博客网 时间:2024/06/10 18:39

一.排序算法

1.稳定性

选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序、基数排序、桶排序和计数排序(通过逆序遍历来保证稳定性)是稳定的排序算法

2.比较次数与初始序列无关

归并排序、选择排序比较次数与初始序列无关,快速排序、冒泡排序、插入排序(直接插入、希尔排序)则有关,堆排序对初始序列不敏感,这是其比快排好的地方

3.时间复杂度(最好、最坏、平均)

1.归并和堆排最好、最坏、平均情况一样,都是O(nlogn);

2.直接插入排序和冒泡的最坏、最好、平均都一样,分别是O(n*n),O(n),O(n*n);

3.简单选择排序最好、最坏和平均都是O(n*n);

4.快排最好和平均都是O(nlogn),最坏O(n*n);

5.shell排序:平均是O(nlogn)- O(n*n),最好O(n1.3),最坏O(n*n);

4.基于比较的 VS 不基于比较的

https://www.byvoid.com/blog/sort-radix

基于比较的排序算法性能是不可能突破 O(NlogN)的,证明如下:

N个数有N!个可能的排列情况,也就是说基于比较的排序算法的判定树有N!个叶子结点,比较次数至少为log(N!)=O(NlogN)(斯特林公式)。

非基于比较的排序,如计数排序桶排序,和在此基础上的基数排序,则可以突破O(NlogN)时间下限。但要注意的是,非基于比较的排序算法的使用都是有条件限制的,例如元素的大小限制,相反,基于比较的排序则没有这种限制(在一定范围内)。

5.计数排序

将元素放入目标数组时是通过逆序遍历来保证数组稳定性的(操作是在最后一步)

http://blog.csdn.net/neilhappy/article/details/7202507  http://zh.wikipedia.org/wiki/%E8%AE%A1%E6%95%B0%E6%8E%92%E5%BA%8F

6.桶排序

http://hxraid.iteye.com/blog/647759

7.基数排序

http://www.cnblogs.com/sun/archive/2008/06/26/1230095.html 稳定排序能保证,上一次的排序成果被保留,十位数的排序过程能保留个位数的排序成果,百位数的排序过程能保留十位数的排序成果.

时间复杂度最好可以达到o(k*n),其中k是最大元素位数,n是元素个数

8.三种线性排序算法比较

从整体上来说,计数排序,桶排序都是非基于比较的排序算法,而其时间复杂度依赖于数据的范围,桶排序还依赖于空间的开销和数据的分布。而基数排序是一种对多元组排序的有效方法,具体实现要用到计数排序或桶排序。

在实际应用中,基数排序可以用于后缀数组的倍增算法,使时间复杂度从O(NlogNlogN)降到O(N*logN)。线性排序算法使用最重要的是,充分利用数据特殊的性质,以达到最佳效果

9.空间复杂度

1.快排需要一个栈来保存调用信息,最好、最坏、平均情况下分别为O(logn)、O(n)、O(logn)

2.直接插入排序、希尔排序、冒泡排序、选择排序、堆排序:O(1)

3.归并排序:O(n)

二.查找算法

1.二叉查找成功和不成功情况下比较次数

2.散列查找