Princeton-Algorithm-Sort初级

2017-01-07  本文已影响0人  kevinscake

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

1. Sort Any Type of Data

2. Selection Sort

基本思想:

保持前部分sorted,后部分unsorted。在第i次迭代中,在未排序的部分中找最小的,再将最小的swap到位置i。

两个不变性invariants:

  1. 左半部分由小至大已排序
  2. 右半部分的数据都不小于左半部分
selection sort invariants

实现

选择排序实现

效率

选择排序性质

3. Insertion Sort

基本思想

保持前部分有序,后部分无序。在第i次迭代中,将第i个数据插入到之前排好序的数据中的相应位置。

两个不变性invariants

  1. 已排好序的左半部分
  2. 右半部分目前还从未得到访问
insertion sort invariants

实现

插入排序实现

效率

引入一个概念:逆序对inversion

是指一对各自相对大小错位的数据对。对数据的swap操作就是在减少逆序对。

4. Shell Sort

基本思想

相当于一个进阶版插入排序。在插入排序中,当数据在找自己的相应位置时,数据的移动一次只移动一位,但在希尔排序中,数据的一次移动h次,称之为h-sort。

基本方法

利用一个increament sequence(1~h)。首先开始h-sort,不断地进行到1-sort(即Insertion sort)。好处在于:

如何决定要用到的Increment Sequence?
Increment Sequence对该算法的效率有影响。该采用怎样的sequence来做h-sort,仍然处在一个不断研究的过程。

实现

希尔排序实现

效率

理论上确切的数值还没有定论!但是用3x+1这样的序列的话,复杂度大概是O(N^1.5),实践上其实接近了O(NlgN)。

5. 排序问题引出的相关问题:Shuffle

思路1:

给每个数据随机生成一个自然数,然后再以这个自然数为key来sort数据,结果产生一个uniformly random permutation。

效率:

sort上花销大。

思路2:Knuth Shuffle -> 线性

进行N次循环,第i次循环中,在0 ~ i之间等概率地(uniformly random)生成一个随机数r,最后将a[r]与a[i]的位置交换。

实现

Knuth Shuffle

效率

这样的shuffle方式保证了每种premutation等概率出现(uniformly random),可以达到线性效率

注意:只能是动态的部分的范围中随机生成一个数r,不能一直以全局的长度生成一个随机数,这样的出的结果并不是uniformly random permutation。

应用

上一篇 下一篇

猜你喜欢

热点阅读