排序算法/查找算法总结
来源:互联网 发布:男士双肩包 知乎 编辑:程序博客网 时间: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.散列查找
- 排序,查找算法 总结
- 排序算法/查找算法总结
- 排序和查找算法总结
- 各种排序、查找算法总结
- 排序和查找算法总结
- 排序查找算法大总结
- 排序算法&查找算法
- 算法-排序查找算法
- iOS 排序算法总结、二分法查找
- 数据结构查找排序算法总结分析
- 找工作-基本查找排序算法总结
- iOS 排序算法总结、二分法查找
- iOS 排序算法总结、二分法查找
- 基础知识点总结:查找和排序算法
- 总结:查找和排序相关算法
- 查找,排序算法时间复杂度总结
- 查找算法和排序算法的归纳总结
- 排序算法和查找算法
- C++成员变量与函数内存分配
- 如何将MSHFlexGrid控件中的内容导出为Excel
- 悔恨啊
- LeetCode - Count and Say
- commline interface lib libcli for Windows 7
- 排序算法/查找算法总结
- ruby 中输入字符串的判断方法
- SQL对数据库的操作(增删查改)
- Linux后台管理
- 对onreadystatechange属性的理解
- php长期定时刷新一个页面
- Class Profile for MBA Class of 2014*
- Android蓝牙操作
- js中 a : function(){}这是什么格式? 代表什么含义?怎样学习这样的格式?