Princeton-Algorithm-Sort初級

該文章為Princeton-Algorithms Part I讀書筆記谐檀,相關視頻在此斩狱。

1. Sort Any Type of Data

  • Comparable接口
    只要對象實現(xiàn)了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. 右半部分的數(shù)據(jù)都不小于左半部分
selection sort invariants

實現(xiàn)

選擇排序實現(xiàn)

效率

  • O(N^2)
  • input insensitive:即使是sorted的input也會花O(N^2)的時間
  • 對數(shù)據(jù)的移動是最少的旬薯,最優(yōu)的數(shù)據(jù)交換次數(shù),至多O(N)
選擇排序性質

3. Insertion Sort

基本思想

保持前部分有序适秩,后部分無序绊序。在第i次迭代中,將第i個數(shù)據(jù)插入到之前排好序的數(shù)據(jù)中的相應位置秽荞。

兩個不變性invariants

  1. 已排好序的左半部分
  2. 右半部分目前還從未得到訪問
insertion sort invariants

實現(xiàn)

插入排序實現(xiàn)

效率

  • best:O(N)骤公,worst:O(N2),average:O(N2)
  • Input sensitive扬跋,對于partially sorted的數(shù)組阶捆,時間可以達到線性O(N)

引入一個概念:逆序對inversion

是指一對各自相對大小錯位的數(shù)據(jù)對。對數(shù)據(jù)的swap操作就是在減少逆序對钦听。

  • An array is partially sorted if the number of inversions is ≤ c N.
  • 實際上是插入排序的用時是O(I + N)洒试。I是inversion的數(shù)量(最好是0,最差N^2)朴上,N是遍歷數(shù)組的用時垒棋。當逆序對的數(shù)量是n的數(shù)量級,那么稱數(shù)據(jù)partially ordered痪宰。對于這樣的數(shù)據(jù)集叼架,插入排序的效率可以達到線性。(因為交換的次數(shù)是o(n)衣撬,比較的次數(shù)也是O(n))乖订。

4. Shell Sort

基本思想

相當于一個進階版插入排序。在插入排序中淮韭,當數(shù)據(jù)在找自己的相應位置時垢粮,數(shù)據(jù)的移動一次只移動一位,但在希爾排序中靠粪,數(shù)據(jù)的一次移動h次蜡吧,稱之為h-sort。

基本方法

利用一個increament sequence(1~h)占键。首先開始h-sort昔善,不斷地進行到1-sort(即Insertion sort)。好處在于:

  • 對于大的h畔乙,insertion sort的比較步長大君仆,會省去很多比較,因此效率高。
  • 對于小的h返咱,由于在之前的sorting中減少了一部分inversions钥庇,所以數(shù)組現(xiàn)在屬于partially sorted,因此insertion sort的效率又得以提升咖摹!

如何決定要用到的Increment Sequence评姨?
Increment Sequence對該算法的效率有影響。該采用怎樣的sequence來做h-sort萤晴,仍然處在一個不斷研究的過程吐句。

實現(xiàn)

希爾排序實現(xiàn)

效率

理論上確切的數(shù)值還沒有定論!但是用3x+1這樣的序列的話店读,復雜度大概是O(N^1.5)嗦枢,實踐上其實接近了O(NlgN)。

5. 排序問題引出的相關問題:Shuffle

思路1:

給每個數(shù)據(jù)隨機生成一個自然數(shù)屯断,然后再以這個自然數(shù)為key來sort數(shù)據(jù)文虏,結果產(chǎn)生一個uniformly random permutation。

效率:

sort上花銷大殖演。

思路2:Knuth Shuffle -> 線性

進行N次循環(huán)择葡,第i次循環(huán)中,在0 ~ i之間等概率地(uniformly random)生成一個隨機數(shù)r剃氧,最后將a[r]與a[i]的位置交換。

實現(xiàn)

Knuth Shuffle

效率

這樣的shuffle方式保證了每種premutation等概率出現(xiàn)(uniformly random)阻星,可以達到線性效率朋鞍。

注意:只能是動態(tài)的部分的范圍中隨機生成一個數(shù)r,不能一直以全局的長度生成一個隨機數(shù)妥箕,這樣的出的結果并不是uniformly random permutation滥酥。

應用

  • 德?lián)湎磁?br> 實際應用中實際上由于seed的限制,會有很多bug:
    洗牌實現(xiàn)

    所以畦幢,實際應用中可以利用硬件來洗牌坎吻,當然,依然不能夠完美宇葱,總之瘦真,完美的隨機洗牌是hard的!
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末黍瞧,一起剝皮案震驚了整個濱河市诸尽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌印颤,老刑警劉巖您机,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡际看,警方通過查閱死者的電腦和手機咸产,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仲闽,“玉大人脑溢,你說我怎么就攤上這事“遥” “怎么了焚志?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長畏鼓。 經(jīng)常有香客問我酱酬,道長,這世上最難降的妖魔是什么云矫? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任膳沽,我火速辦了婚禮,結果婚禮上让禀,老公的妹妹穿的比我還像新娘挑社。我一直安慰自己,他們只是感情好巡揍,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布痛阻。 她就那樣靜靜地躺著,像睡著了一般腮敌。 火紅的嫁衣襯著肌膚如雪阱当。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天糜工,我揣著相機與錄音弊添,去河邊找鬼。 笑死捌木,一個胖子當著我的面吹牛油坝,可吹牛的內容都是我干的。 我是一名探鬼主播刨裆,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼澈圈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帆啃?” 一聲冷哼從身側響起极舔,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎链瓦,沒想到半個月后拆魏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盯桦,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年渤刃,在試婚紗的時候發(fā)現(xiàn)自己被綠了拥峦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡卖子,死狀恐怖略号,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情洋闽,我是刑警寧澤玄柠,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站诫舅,受9級特大地震影響羽利,放射性物質發(fā)生泄漏。R本人自食惡果不足惜刊懈,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一这弧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虚汛,春花似錦匾浪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至将谊,卻和暖如春梯浪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓢娜。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留礼预,地道東北人眠砾。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像托酸,于是被迫代替她去往敵國和親褒颈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經(jīng)驗励堡。 張土汪:刷leetcod...
    土汪閱讀 12,747評論 0 33
  • 概述 排序有內部排序和外部排序谷丸,內部排序是數(shù)據(jù)記錄在內存中進行排序,而外部排序是因排序的數(shù)據(jù)很大应结,一次不能容納全部...
    蟻前閱讀 5,186評論 0 52
  • 概述排序有內部排序和外部排序刨疼,內部排序是數(shù)據(jù)記錄在內存中進行排序泉唁,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的...
    Luc_閱讀 2,275評論 0 35
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,258評論 0 2
  • 誰的筆下在生花 誰的欲望在迸發(fā) 蘸狼煙揮毫一幅一一 江山的畫 誰的刀劍舞狂草 誰的馬蹄停不了 揚黃沙彈奏一曲一一 ...
    靜海深深閱讀 219評論 0 0