内容简介:在此之前大家可以看下这个浅谈算法的BBC先回顾下:(BBC讨论概况:
在此之前大家可以看下这个浅谈算法的BBC先回顾下:
( bilibili地址 ,这里不引用bilibili因为bilibili比较模糊)
BBC讨论概况:
- 通过一个小游戏讲述了算法在生活中的作用
- 从1964年诞生的冒泡 排序算法 开始介绍 排序 的算法
- 归并排序(拆分区域,分别合并有序的区域(由于有序对区域头分别对比即可),展示了只要数据一多归并排序对比冒泡排序的优势就展示出来了
- 大概介绍了世界上有大约20种的排序算法
- 最短路径问题: 通过实验,展示了蜜蜂在寻找最短路径上的天赋,不过蜜蜂并不是找到最短的路径,而是对于其而言接近最短路径,换言之是足够短的路径
I. 各类排序应用场景对比
世界上有大于20种的排序排序算法,比如网络上就有 23种排序算法比较 的视频。
再比如 该圆盘排序对比 给了很多有趣的排序,下面对其中提到效率对比:
- Double Selection Sort
- Gravity Sort
- Counting Sort
- Radix LSD Sort(Base 4)
- Radix LSD In-Place Sort (Base 10)
- Radix MSD Sort(Base 4)
- Time Sort(mul 4) + Insertion Sort
不过今天我们主要谈到常见的9种排序。对于排序而言其效率无法进行纯粹的对比,因为其涉及的纬度众多,比如数据量,原本的混乱情况,读写速度、处理速度等都会对其影响。
不过我们今天就对于混乱情况借助下面这个很有意思的视频,对其效率进行排序下:
| 效率排名 | 完全逆序 | 乱序 | 部分相同 | 几乎有序 |
|---|---|---|---|---|
| 1 | 快速排序(Quick) | 快速排序(Quick) | 快速排序(Quick) | 插入排序(Insertion) |
| 2 | 希尔排序(Shell) | 希尔排序(Shell) | 希尔排序(Shell) | 鸡尾酒排序(Cocktail) |
| 3 | 归并排序(Merge) | 归并排序(Merge) | 归并排序(Merge) | 快速排序(Quick) |
| 4 | 堆排序(Heap) | 堆排序(Heap) | 堆排序(Heap) | 希尔排序(Shell) |
| 5 | 梳排序(Comb) | 梳排序(Comb) | 梳排序(Comb) | 归并排序(Merge) |
| 6 | 选择排序(Selection) | 插入排序(Insertion) | 插入排序(Insertion) | 梳排序(Comb) |
| 7 | 插入排序(Insertion) | 选择排序(Selection) | 选择排序(Selection) | 堆排序(Heap) |
| 8 | 冒泡排序(Bubble) | 鸡尾酒排序(Cocktail) | 鸡尾酒排序(Cocktail) | 冒泡排序(Bubble) |
| 9 | 鸡尾酒排序(Cocktail) | 冒泡排序(Bubble) | 冒泡排序(Bubble) | 选择排序(Selection) |
II. 各类排序详细分析
1. 选择排序 - Selection sort
原理
选择排序为众多排序里面最简单暴力的方案,简而言之就是每次找到最小的放到前面: 遍历长度为n的整个数组,第i次遍历,找到最小的(或最大)与i所在值进行替换。
每次交换情况:
5 6 1 8 2 4
↑ ↑
└─────┘
[1] 6 5 8 2 4
↑ ↑
└────────┘
[1, 2] 5 8 6 4
↑ ↑
└────────┘
[1, 2, 4] 8 6 5
↑ ↑
└─────┘
[1, 2, 4, 5] 6 8
[1, 2, 4, 5, 6] 8
[1, 2, 4, 5, 6, 8]
效率分析
- 交换操作次数: [0, n-1] -> $O(n)$
- 比较次数: (n-1) + (n-2) + … + 1 = $n\frac{(n-1)}{2} -> $O(n^2)$
- 最好情况: 已经有序,交换0次
- 最坏情况: 交换$n-1$次
- 逆序交换: 交换$\frac{n}{2}$次
- 稳定性: 不稳定排序(由于每次交换前后顺序就被破坏)
- 时间复杂度: $O(n^2)$
- 空间复杂度: $O(1)$
横向对比
- 交换次数比
冒泡排序少很多 : 比冒泡排序快,由于交换所需CPU时间 > 比较所需CPU时间 - 当记录占用字节数较多时,通常比
插入排序执行速度快些。
2. 插入排序 - Insert sort
插入排序-维基 , 在几乎排列好的队列中效率最高,因为在有序的队列中,其完全不用赋值,只需要进行$n-1$次比较即完成排序。
原理
插入排序的原理很想扑克牌抓牌,每次抓牌都是从桌面上的牌抓起插入已经排好序的手中的牌中: 往已经有序的数据序列中插入一个数,使得插入完成后依然有序。
每次交换情况:
[5] 6 1 8 2 4
↑ │
└──┘
[5, 6] 1 8 2 4
↑ │
└───────┘
[1, 5, 6] 8 2 4
↑ │
└──┘
[1, 5, 6, 8] 2 4
↑ │
└──────────┘
[1, 2, 5, 6, 8] 4
↑ │
└───────┘
[1, 2, 4, 5, 6, 8]
效率分析
- 稳定性: 稳定排序
- 比较操作最好情况: 源数据有序,只需要$n-1$次
- 比较操作最坏情况: 源数据逆序,需要$\frac{1}{2}n(n-1)$次
- 赋值次数: $(比较操作次数) - (n-1)$ 因为$n-1$次循环中,每一次循环的比较都比赋值多一个,多在最后那次比较并不带来赋值
- 时间复杂度: $O(n^2)$ (最坏: $O(n^2)$; 最优: $O(n)$)
- 空间复杂度: 辅助空间$O(1)$用于
已有应用场景
- 由于其时间复杂度的缘故,不适合用于数据量较大的数据(如量级大于千)
- 在STL的sort算法和stdlib的qsort算法中被作为快速排序的补充,用于少量元素的排序(8个或以下)
3. 冒泡排序 – Bubble sort
原理
从后往前分别两两对比,
每次交换情况:
5 6 1 8 2 4
↑ ↑
└──┘
5 6 1 2 8 4
↑ ↑
└──┘
5 1 6 2 8 4
↑ ↑
└──┘
[1] 5 6 2 8 4
↑ ↑
└──┘
[1] 5 6 2 8 4
↑ ↑
└──┘
[1] 5 6 2 4 8
↑ ↑
└──┘
[1] 5 2 6 4 8
↑ ↑
└──┘
[1, 2] 5 6 4 8
↑ ↑
└──┘
[1, 2] 5 4 6 8
↑ ↑
└──┘
[1, 2, 4] 5 6 8
[1, 2, 4, 5] 6 8
[1, 2, 4, 5, 6] 8
[1, 2, 4, 5, 6, 8]
以上所述就是小编给大家介绍的《各类排序算法对比》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 算法之常见排序算法-冒泡排序、归并排序、快速排序
- 排序算法之冒泡排序改进算法
- 快速排序算法,C语言快速排序算法深入剖析
- 排序算法下——桶排序、计数排序和基数排序
- 数据结构和算法面试题系列—排序算法之快速排序
- 数据结构和算法面试题系列—排序算法之基础排序
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Pro JavaScript Techniques
John Resig / Apress / 2006-12-13 / USD 44.99
Pro JavaScript Techniques is the ultimate JavaScript book for the modern web developer. It provides everything you need to know about modern JavaScript, and shows what JavaScript can do for your web s......一起来看看 《Pro JavaScript Techniques》 这本书的介绍吧!