该文章为Princeton-Algorithms Part I读书笔记,相关视频在此。
1. 归并排序Merge Sort(递归版本:top-down)
基本思想:
- 递归式的将数据分两半,各自排序
- 合并结果。
关键:
given 2 sorted array,do in-place merge

实现:

效率:

时间最好与最坏都是O(nlgn),空间O(n)

2. 归并排序Merge Sort(非递归版本:bottom-up)
基本思想:
从两个数据开始,一步步往上merge

3. 对最优排序算法效率的探究

- 任何排序算法在最差情况下至少要比较nlgn次
- 包含大小为n的,各自不同的元素的序列,可能的ordering排列为N!,即决策树的叶子数目为N!,因此高度为lg(N!) ~ NlgN。决策树的高度也是算法的worst case。
4. 排序算法的引出的概念:稳定性Stability
定义
稳定的排序会保持相同key的数据的相对顺序。
排序算法的稳定性
- Insertion sort是稳定的:数据交换的步长为1,相同的数据彼此不会交换
- selection sort是不稳定的:当距离较远数据进行交换时,有可能越过key相同的数据。
- shell sort是不稳定的:同理上。
- merge sort是稳定的:merge的过程如果key相同,取左边的数。
分析的关键在于相同的key的元素是否会发生交换
5. 快速排序Quick sort(基于递归)
基本思想:
- shuffle 数据
- partition数据使得某个a[j]处于正确的位置,即左边数据都小,右边数据都大
- 递归左右
关键:Partition
In-place,不需要额外空间
思路:
- 随机洗牌之后定出一个pivot
- 两个指针,前后向中间逼近,直到各自找到该交换的元素(即左边的比pivot大,右边的比pivot小)
- 交换两个数据,继续,重复知道两个指针交叉。

实现

性质
- 效率:worst case可以达到O(n^2),平均时间O(nlgn),空间O(1),因此快排是一种in-place sorting algorithm。
- random shuffle对pivot的选取可以提升算法效率,避免worst case。因为能让pivot值恰好在中间的概率更大,等分数据的概率更大。
- 不稳定,因为在partition中依然存在long-range exchange
6. Partition引出的相关问题:quick selection问题
例子:
求第k大的元素,求top k元素,。。。
基本思想:
- 利用partition的思想对数据进行划分
- 判断要找的元素是否为指针j,如果是,j则为结果
- 如果目标k小于j,在j的左半部分递归继续找;如果大于,找右边
实现

效率
- In average,可以达到线性!
- Worst case,O(N^2)
7. quick sort算法的引出的概念:对Duplicate Key的处理
目的
在quick sort算法partition中,将key相同的数据排在一起,可以提升算法的效率
算法:Dijkstra 3-way partitioning
使得partition之后,与pivot相同key的数据可以连在一起
基本思想

实现

效率
可以提高常规quick sort算法的效率,许多应用中可以达到线性效率。
8. 关于算法的选择

常常需要考虑一下一些问题:
是否需要stable?是否有duplicate key?输入是否已经partially sorted,还算是randomly ordered?等等。。
总结

一般排序算法在worst case都会达到O(N^2)。在worst case还能NlgN的算法简直是最理想的圣杯(holy grail)。
网友评论