Princeton-Algorithm-Sort初级

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

1. Sort Any Type of Data

  • Comparable接口
    只要对象实现了Comparable接口,它就能够进行比较。


    Comparable接口
  • v.compareTo(w) 方法

    • v < w : -1
    • v = w : 0
    • v > w : 1


      v.compareTo(w)

2. Selection Sort

基本思想:

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

两个不变性invariants:

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

实现

选择排序实现

效率

  • O(N^2)
  • input insensitive:即使是sorted的input也会花O(N^2)的时间
  • 对数据的移动是最少的,最优的数据交换次数,至多O(N)
选择排序性质

3. Insertion Sort

基本思想

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

两个不变性invariants

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

实现

插入排序实现

效率

  • best:O(N),worst:O(N2),average:O(N2)
  • Input sensitive,对于partially sorted的数组,时间可以达到线性O(N)

引入一个概念:逆序对inversion

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

  • An array is partially sorted if the number of inversions is ≤ c N.
  • 实际上是插入排序的用时是O(I + N)。I是inversion的数量(最好是0,最差N^2),N是遍历数组的用时。当逆序对的数量是n的数量级,那么称数据partially ordered。对于这样的数据集,插入排序的效率可以达到线性。(因为交换的次数是o(n),比较的次数也是O(n))。

4. Shell Sort

基本思想

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

基本方法

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

  • 对于大的h,insertion sort的比较步长大,会省去很多比较,因此效率高。
  • 对于小的h,由于在之前的sorting中减少了一部分inversions,所以数组现在属于partially sorted,因此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。

应用

  • 德扑洗牌
    实际应用中实际上由于seed的限制,会有很多bug:
    洗牌实现

    所以,实际应用中可以利用硬件来洗牌,当然,依然不能够完美,总之,完美的随机洗牌是hard的!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,723评论 0 33
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,164评论 0 52
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 2,255评论 0 35
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,239评论 0 2
  • 谁的笔下在生花 谁的欲望在迸发 蘸狼烟挥毫一幅一一 江山的画 谁的刀剑舞狂草 谁的马蹄停不了 扬黄沙弹奏一曲一一 ...
    静海深深阅读 212评论 0 0