直接插入排序、希尔排序、堆排序的比较
来源:互联网 发布:linux运行程序命令gcc 编辑:程序博客网 时间:2024/06/05 02:52
直接插入排序、希尔排序、堆排序
1、之所以把三个排序算法放在一块,是因为他们有相似之处,希尔排序和堆排序都是类似于插入排序,只不过希尔排序是跳着插(按照步长),堆排序是在树中的某一条路径上插。
稳定性:首先,排序算法的稳定性通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果A= B, A原来在位置前,排序后A还是要在B位置前。
2、三种不同插入的比较
(1)直接插入
如:2 8 5 4 7 6
第一次:2 8 5 4 3 6
第二次:2 5 8 4 3 6
第三次:2 4 5 8 3 6
第四次:把3查到前面的序列中,把3取出来,3原来的位置便是一个坑,从8到
2一次与3比较,若大于3则填补坑。如:8比3大,8把3的坑填了,8原来
的位置又有了一个坑。记住这个插入规则。
最好时间:O(N)。如果数组事先是排好序的,那么只遍历一次数组,对于
遍历的每一个元素也只与前面的元素比较一次。
最坏时间/平均时间:O(N^2)。
直接插入排序是一种稳定的算法。适用于小规模数据。
(2)希尔排序
解析:希尔排序是跳着插,希尔是按照步长排序的,最后一个步长为1,等同
于直接插入排序,但此时由于大部分已经排好序了,所有时间复杂的并不是很
高。
如:步长为3时,数组为2 8 5 4 7 6 9 1。那么对每一次数遍历,如第一个元素
2时,我们要对2 4 9进行直接插入排序,也就是之前说的跳着插。之后对
8、5、4、7进行同样的跳着插排序,对于元6、9、1来说,步长不足3,故不
再往后遍历。
说明:步长在很大程度上影响了希尔的效率,这也导致希尔排序并不是一种稳
定的排序算法,不过希尔排序已经在直接插入排序上有所提高。适用于小规模
数据。
(3)堆排序(以最小堆为例)
说明:堆排序可谓是一种非常快的排序算法,其插入和删除的时间复杂度皆为
O(lgN),对于N个元素排序,时间复杂度为O(NlgN)。如此高效的特点使
得其适用于大规模数据的排序。
堆是一颗完全二叉树,可用数组来表示,假设下标0存储根节点,若父节点
下标为i,那么其左儿子下标为2i+1,右儿子下标为2i+2。
解析:对于了解堆排序的同学并不陌生,构建堆之后,堆排序是从最后一个父
节点(标记为A)开始的,A节点的较小儿子等同于直接插入排序中的下标为0
的节点,堆得根节点等同于末尾节点,每条支路对应于一个直接插入排序,类
似于希尔排序按步长分组。
- 直接插入排序、希尔排序、堆排序的比较
- 比较排序总结——直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序
- 选择排序 直接插入排序 希尔排序 堆排序
- 排序算法之直接插入、希尔排序、堆排序三者比较
- 随机生成30个数,试比较直接插入排序、简单选择排序、冒泡排序、快速排序、堆排序和希尔排序的时空性能和稳定性。
- 直接插入排序 + 希尔排序+ 冒泡排序+ 快速排序 + 直接选择排序 + 堆排序
- 冒泡排序 快速排序 选择排序 堆排序 直接插入排序 希尔排序 归并排序
- 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较
- 常见比较排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较
- 归并排序,堆排序,基数排序,希尔排序,快速排序,交换排序,选择排序和插入排序的总结和比较
- 直接插入排序,希尔排序
- 直接插入排序、希尔排序
- 直接插入排序-->希尔排序
- 插入排序-直接插入排序 希尔排序
- 排序算法(堆排序,直接插入排序,折半插入排序,希尔排序)
- 插入排序和希尔排序的比较
- IOS- 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序
- 你知道SEO团队的几种运营模式吗?
- [swift] UITableView单元格背景透明问题
- codeforces 463 B Caisa and Pylons
- setTimeout
- 让QToolBar工具栏的按钮既显示图标又显示文字
- 直接插入排序、希尔排序、堆排序的比较
- 鼠标悬停
- 取整数的最大值最小值值,
- NSString的常用用法(补充)
- ie6却无法点击a连接
- 一个cheat命令 == Linux命令小抄大全
- 漫谈QWidget及其派生类(菜单、菜单栏)
- 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦
- 完全用Linux工作,抛弃windows ----作者:王垠