排序算法

堆排序

時(shí)間復(fù)雜度:Ο(nlogn)
空間復(fù)雜度:一個(gè)輔助空間
穩(wěn)定性:不穩(wěn)定
排序(升序用大根堆屡萤,降序就用小根堆):

  1. 將待排序數(shù)組A[0...n]構(gòu)造成大根堆,此時(shí),整個(gè)數(shù)組的最大值就是堆結(jié)構(gòu)的頂端;
  2. 將頂端的數(shù)(A[0])與末尾的數(shù)(A[n])交換,此時(shí)钮莲,末尾的數(shù)為最大值;
  3. 剩余元素構(gòu)成待排序數(shù)組A[0...n-1]彼水,重復(fù)上述步驟崔拥,直至排序完成。

補(bǔ)充
每個(gè)結(jié)點(diǎn)的值都大于其左凤覆、右孩子結(jié)點(diǎn)的值链瓦,稱之為大根堆;每個(gè)結(jié)點(diǎn)的值都小于其左盯桦、右孩子結(jié)點(diǎn)的值慈俯,稱之為小根堆。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):

  1. 堆排序效率相對(duì)穩(wěn)定拥峦,不像快排在最壞情況下時(shí)間復(fù)雜度會(huì)變成O(n^2)

缺點(diǎn):

  1. 堆排序比較和交換次數(shù)比快速排序多贴膘,所以平均而言比快速排序慢;

使用場(chǎng)景

  1. 獲取最大/小的元素略号,topK之類刑峡。如果你要在很多元素中找很少幾個(gè)top K的元素洋闽,或者在一個(gè)巨大的數(shù)據(jù)流里找到top K,堆排序更適合突梦。
  2. 優(yōu)先隊(duì)列喊递。需要在一組不停更新的數(shù)據(jù)中不停地找最大/小元素

快速排序

時(shí)間復(fù)雜度:O(nlogn),有序時(shí)最差O(n^2)
空間復(fù)雜度:O(logn)~O(n) (遞歸時(shí)使用的椦羲疲空間)
穩(wěn)定性:不穩(wěn)定
排序

  1. 從數(shù)列中選擇一個(gè)基準(zhǔn)元素;
  2. 將比基準(zhǔn)元素大的數(shù)全放到它的右邊铐伴,小于或等于它的數(shù)全放到它的左邊撮奏。
  3. 再對(duì)左右區(qū)間重復(fù)上述步驟,直到各區(qū)間只有一個(gè)數(shù)当宴。

補(bǔ)充
元素的移動(dòng):1. 挖坑法畜吊;2. 指針交換法
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):

  1. 快速排序通常明顯比其他 Ο (n log n) 算法更快

缺點(diǎn):

  1. 排序效率不穩(wěn)定,數(shù)列有序時(shí)效率最差

歸并排序

時(shí)間復(fù)雜度:O(nlogn)
空間復(fù)雜度:O(n)
穩(wěn)定性:穩(wěn)定
排序
歸并排序的基本思想是基于合并操作户矢,即合并兩個(gè)已經(jīng)有序的序列是容易的玲献,不論這兩個(gè)序列是順序存儲(chǔ)還是鏈?zhǔn)酱鎯?chǔ),合并操作都可以在O(m+n)時(shí)間內(nèi)完成(假設(shè)兩個(gè)有序表的長(zhǎng)度為m和n)梯浪。

  1. 劃分捌年。劃分?jǐn)?shù)列為相等(或大致相等)的兩部分;
  2. 治理挂洛。當(dāng)劃分后的子數(shù)列長(zhǎng)度大于1時(shí)礼预,遞歸排序子數(shù)列;當(dāng)子數(shù)列長(zhǎng)度等于1時(shí)虏劲,則已經(jīng)成為有序數(shù)列托酸;
  3. 組合。將兩個(gè)有序子數(shù)列合并為一個(gè)有序數(shù)列柒巫。

優(yōu)缺點(diǎn)
優(yōu)點(diǎn):

  1. 歸并排序是最常用的外部排序方法(當(dāng)待排序的記錄放在外存上励堡,內(nèi)存裝不下全部數(shù)據(jù)時(shí),歸并排序仍然適用堡掏,當(dāng)然歸并排序同樣適用于內(nèi)部排序...)

缺點(diǎn):

  1. 輔助空間大O(n)
  2. 實(shí)用性較差

直接插入排序

時(shí)間復(fù)雜度:最好情況(基本有序):O(n) 应结、平均情況:O(n^2) 、最壞情況:O(n^2)
空間復(fù)雜度:一個(gè)輔助空間
穩(wěn)定性:穩(wěn)定
排序
把n個(gè)待排序的元素看成為一個(gè)有序表和一個(gè)無(wú)序表泉唁。開始時(shí)有序表中只包含1個(gè)元素摊趾,無(wú)序表中包含有n-1個(gè)元素,排序過(guò)程中每次從無(wú)序表中取出第一個(gè)元素游两,將它插入到有序表中的適當(dāng)位置砾层,使之成為新的有序表,重復(fù)n-1次可完成排序過(guò)程贱案。

優(yōu)缺點(diǎn)
優(yōu)點(diǎn):

  1. 數(shù)列接近有序時(shí)時(shí)間復(fù)雜度接近O(n)

缺點(diǎn):

  1. 移動(dòng)元素的次數(shù)比較多

使用場(chǎng)景

  1. 當(dāng)數(shù)組基本有序的情況下適合使用直接插入排序和冒泡排序肛炮,它們?cè)诨居行虻那闆r下排序的時(shí)間復(fù)雜度接近O(n)

折半插入排序

時(shí)間復(fù)雜度:最好情況(基本有序):O(n) 止吐、平均情況:O(n^2) 、最壞情況:O(n^2)
空間復(fù)雜度:一個(gè)輔助空間
穩(wěn)定性:穩(wěn)定
排序
直接插入排序確認(rèn)插入位置是通過(guò)在有序序列中逐個(gè)比較得到的侨糟。既然是有序序列中確認(rèn)位置碍扔,則可以通過(guò)二分法來(lái)確認(rèn)插入位置。即通過(guò)折半查找的方式確認(rèn)插入位置秕重。
折半插入排序僅減少了元素的比較次數(shù)不同,但是沒(méi)有減少元素的移動(dòng)次數(shù),時(shí)間復(fù)雜度O(n^2)

希爾排序

時(shí)間復(fù)雜度:比直接插入排序要高溶耘,與增量序列的選取密切相關(guān)二拐。
空間復(fù)雜度:一個(gè)輔助空間
穩(wěn)定性:不穩(wěn)定
排序

  1. 確認(rèn)一個(gè)增量序列t1, t2, t3, ... , tk。其中序列遞減凳兵,且tk=1百新;
  2. 按照增量ti,將待排序列分割成ti個(gè)子序列(例如增量為3時(shí)庐扫,(0,3,6)饭望、(1,4,7)、(2,5,8)分別為一組)形庭;
  3. 分別對(duì)每個(gè)子序列進(jìn)行直接插入排序铅辞;
  4. 取下一個(gè)增量t(i+1),重復(fù)2/3步操作萨醒;
  5. 直到當(dāng)增量tk=1時(shí)巷挥,所有序列作為一個(gè)序列來(lái)處理,完成排序验靡。

補(bǔ)充
希爾排序又稱縮小增量排序倍宾。屬于插入類排序,是對(duì)直接插入排序的改進(jìn)胜嗓,在時(shí)間效率上有較大改進(jìn)高职。
希爾排序優(yōu)化出發(fā)點(diǎn):

  1. 在序列基本有序時(shí),直接插入排序時(shí)間復(fù)雜度可接近O(n)辞州。由此可知怔锌,在序列基本有序時(shí),直接插入排序的效率可大大提高变过;
  2. 直接插入排序方法簡(jiǎn)單埃元,在n值較小時(shí)效率較高
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市媚狰,隨后出現(xiàn)的幾起案子岛杀,更是在濱河造成了極大的恐慌,老刑警劉巖崭孤,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件类嗤,死亡現(xiàn)場(chǎng)離奇詭異糊肠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)遗锣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門货裹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人精偿,你說(shuō)我怎么就攤上這事弧圆。” “怎么了笔咽?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵搔预,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拓轻,道長(zhǎng),這世上最難降的妖魔是什么经伙? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任扶叉,我火速辦了婚禮,結(jié)果婚禮上帕膜,老公的妹妹穿的比我還像新娘枣氧。我一直安慰自己,他們只是感情好垮刹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布达吞。 她就那樣靜靜地躺著,像睡著了一般荒典。 火紅的嫁衣襯著肌膚如雪酪劫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天寺董,我揣著相機(jī)與錄音覆糟,去河邊找鬼。 笑死遮咖,一個(gè)胖子當(dāng)著我的面吹牛滩字,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播御吞,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼麦箍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了陶珠?” 一聲冷哼從身側(cè)響起挟裂,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎揍诽,沒(méi)想到半個(gè)月后馋评,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弧岳,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晓避,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了划滋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡埃篓,死狀恐怖处坪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情架专,我是刑警寧澤同窘,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站部脚,受9級(jí)特大地震影響想邦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜委刘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一丧没、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锡移,春花似錦呕童、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至施符,卻和暖如春往声,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背戳吝。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工烁挟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骨坑。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓撼嗓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親欢唾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子且警,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本文首發(fā)于我的個(gè)人博客:尾尾部落 排序算法是最經(jīng)典的算法知識(shí)。因?yàn)槠鋵?shí)現(xiàn)代碼短礁遣,應(yīng)該廣斑芜,在面試中經(jīng)常會(huì)問(wèn)到排序算法...
    繁著閱讀 4,574評(píng)論 3 119
  • 概述 因?yàn)榻⊥由蠈?duì)各種排序算法理解不深刻祟霍,過(guò)段時(shí)間面對(duì)排序就蒙了杏头。所以決定對(duì)我們常見的這幾種排序算法進(jìn)行統(tǒng)一總...
    清風(fēng)之心閱讀 700評(píng)論 0 1
  • 概述 排序有內(nèi)部排序和外部排序盈包,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大醇王,一次不能容納全部...
    蟻前閱讀 5,184評(píng)論 0 52
  • 穩(wěn)定:如果a原本在b前面呢燥,而a=b,排序之后a仍然在b的前面寓娩;不穩(wěn)定:如果a原本在b的前面叛氨,而a=b,排序之后a可...
    意識(shí)流丶閱讀 3,162評(píng)論 2 9
  • UIImage有一個(gè)只讀屬性:renderingMode棘伴,對(duì)應(yīng)的還有一個(gè)方法:imageWithRendering...
    LGirl閱讀 249評(píng)論 0 0