Princeton-Algorithm-Sort经典

该文章为Princeton-Algorithms Part I读书笔记,相关视频在此。

1. 归并排序Merge Sort(递归版本:top-down)

基本思想:

  1. 递归式的将数据分两半,各自排序
  2. 合并结果。

关键:

given 2 sorted array,do in-place merge


Princeton-Algorithm-Sort经典_第1张图片
merge实现

实现:

Princeton-Algorithm-Sort经典_第2张图片
归并排序实现

效率:时间O(nlgn),空间O(n)

Princeton-Algorithm-Sort经典_第3张图片
归并排序效率分析

2. 归并排序Merge Sort(非递归版本:bottom-up)

基本思想:

从两个数据开始,一步步往上merge

Princeton-Algorithm-Sort经典_第4张图片
归并排序实现(自底向上)

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

Princeton-Algorithm-Sort经典_第5张图片
最优排序算法的效率
  • 任何排序算法在最差情况下至少要比较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(基于递归)

基本思想:

  1. shuffle 数据
  2. partition数据使得某个a[j]处于正确的位置,即左边数据都小,右边数据都大
  3. 递归左右

关键:Partition

In-place,不需要额外空间

思路:
  1. 随机洗牌之后定出一个pivot
  2. 两个指针,前后向中间逼近,直到各自找到该交换的元素(即左边的比pivot大,右边的比pivot小)
  3. 交换两个数据,继续,重复知道两个指针交叉。
Princeton-Algorithm-Sort经典_第6张图片
快排partition

实现

Princeton-Algorithm-Sort经典_第7张图片
快排实现

性质

  • 效率:worst case可以达到O(n^2),平均时间O(lgn),空间O(1),因此快排是一种in-place sorting algorithm。
  • random shuffle对pivot的选取可以提升算法效率,避免worst case。因为能让pivot值恰好在中间的概率更大,等分数据的概率更大。
  • 不稳定,因为在partition中依然存在long-range exchange

6. Partition引出的相关问题:quick selection问题

例子:

求第k大的元素,求top k元素,。。。

基本思想:

  1. 利用partition的思想对数据进行划分
  2. 判断要找的元素是否为指针j,如果是,j则为结果
  3. 如果目标k小于j,在j的左半部分递归继续找;如果大于,找右边

实现

Princeton-Algorithm-Sort经典_第8张图片
quick selection实现

效率

  • In average,可以达到线性!
  • Worst case,O(N^2)

7. quick sort算法的引出的概念:对Duplicate Key的处理

目的

在quick sort算法partition中,将key相同的数据排在一起,可以提升算法的效率

算法:Dijkstra 3-way partitioning

使得partition之后,与pivot相同key的数据可以连在一起

基本思想

Princeton-Algorithm-Sort经典_第9张图片
Dijkstra 3-way partitioning

实现

Princeton-Algorithm-Sort经典_第10张图片
Dijkstra 3-way partitioning实现

效率

可以提高常规quick sort算法的效率,许多应用中可以达到线性效率

8. 关于算法的选择

Princeton-Algorithm-Sort经典_第11张图片
算法的选择

常常需要考虑一下一些问题:

是否需要stable?是否有duplicate key?输入是否已经partially sorted,还算是randomly ordered?等等。。

总结

Princeton-Algorithm-Sort经典_第12张图片
排序算法总结

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

你可能感兴趣的:(Princeton-Algorithm-Sort经典)