排序算法总结

目录

  • 1.比较型排序算法对比
  • 2.比较排序算法的下界
    2.1 算法导论提供的解释
    2.2 刘未鹏提供的解释
  • 3.快排为什么那么快?
    3.1 为什么堆排比快排慢
    3.2 为什么快排其实也不是那么快
    3.3 计数排序、桶排序为什么那么快?
  • 4.一种看问题的视角
  • 5.排序算法的应用

1.比较型排序算法对比

排序算法总结_第1张图片
排序算法对比
排序算法总结_第2张图片

2.比较排序算法的下界

2.1 算法导论提供的解释

在一个比较排序算法中,只使用元素间的比较来获得输入序列中元素间次序的信息。
比较排序可以抽象成一颗决策树,决策树是一颗完全二叉树,它可以表示在给定输入规模的情况下,某一特定排序算法对所有元素的比较操作。


排序算法总结_第3张图片

在决策树中,每个内部节点都以i:j标记,其中, 1≤i, j ≤n,n是输入序列中的元素个数。每个叶节点都标注了一个序列<Π(1), Π(2), ..., Π(n),>。排序算法的执行对应于一条从树的根节点到叶节点的路径。每一个内部节点表示一次比较ai≤aj。左子树表示一旦我们确定ai≤aj之后的后续比较,右子树表示在确定了ai>aj后的后续比较。当到达一个叶节点时,表示排序算法已经确定了一个顺序:


最坏情况的下界:
在决策树中,从根节点到任意一个可达叶节点之间最长简单路径的长度,表示的是对应的排序算法中最坏情况下的比较次数。也即决策树的高度。


排序算法总结_第4张图片

2.2 刘未鹏提供的解释

排序的本质:一组未排序的n个数字,它们一共有n!种排序,其中只有一种排列是从小到大排列。

比较排序:任何基于比较的排序基本操作单元都是“比较a和b”,输出只有两种答案。一个只有两种输出的问题最多只能将可能性空间切成两半,最佳的切法是切成1/2和1/2。

最优下界:我们希望每次比较a和b时,ab的概率是均等的,这样我们就能保证无论无任何都能讲可能性缩小为原来的一半。

  • log_2(n!) = nlogn

3.快排为什么那么快?

3.1 为什么堆排比快排慢

堆排的步骤:

  • step1.建立最大堆(堆顶的元素大于两个儿子,两个儿子又分别大于它们各自下属的两个儿子...)
  • step2.将堆顶的元素和最后一个元素对调(相当于将堆顶拿走,然后将堆底的那个元素补上空位,然后让那最后一个元素从顶上往下滑到恰当的位置,重新成为最大堆)
  • step3.重复第二步

堆底的元素肯定很小,将它拿到堆顶和原本属于最大元素的两个子节点比较,它比它们大的可能性是微乎其微的。这一次的比较结果是概率不均等的。
实际上该元素肯定小于其中的一个儿子(从一颗子树的最底下取出的),而大于另一个儿子的可能性非常小。

改进版:MacKay提供了一个修改版的堆排,每次不是将堆底的元素拿上来,而是直接比较堆顶元素的两个儿子,选出次大的元素。(这个怎么实现?如下图所示)


排序算法总结_第5张图片

3.2 为什么快排其实也不是那么快

快排的过程:
随机选择一个轴元素,将所有大于轴元素的移到左边,其余移到右边。

快排的第一次比较是将一个元素和轴元素比较,这个时候“大于”和“小于”各占一半。
快排的第二次比较a2与pivot比较,不妨令a1 < pivot,就有三种不同的情况
a2 < pivot: a1 < a2 < pivot; a2 < a1 < pivot 这个可能性占了2/3
a2 > pivot: a1 < pivot < a2这个可能性占了1/3
因此不是等概率的划分可能性空间

3.3 计数排序、桶排序为什么那么快?

当i张牌放到位之后,放置第i+1张牌的时候有多少种可能性?大约i+1中。因为前i张牌将13个位置分割成了i+1个区间。因此计数排序砍掉了i/i+1种可能性。

4.一种看问题的视角

将排序问题看成和猜数字一样,是通过问问题来缩小/排除结果的可能性区间。
“最好的问题”就是那些能够均分所有可能性的问题,因为能排除掉k-1/k种可能性,而不均衡的问题会有一个或者一些答案分支排除掉的可能性少于k-1/k,于是策略的下界就被拖累了。

5.排序算法的应用

5.1 商业计算

排序算法总结_第6张图片

5.2 信息搜索

有序的信息确保可以用经典的二分查找法进行高效的搜索。
查找、搜索——二分查找的各种扩展——各种搜索树。

5.3 运筹学

排序算法总结_第7张图片

5.4 事件驱动模拟


5.5 数值计算

排序算法总结_第8张图片

5.6 组合搜索

排序算法总结_第9张图片

5.7 排序和优先队列在算法设计领域的应用

排序算法总结_第10张图片

你可能感兴趣的:(排序算法总结)