歸并與快排——1.如何選擇合適的排序算法

原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處

1. 排序算法簡(jiǎn)介

提起排序算法,相信大家并不陌生痢甘。最常見(jiàn)也是最基礎(chǔ)的有:插入排序宪拥,選擇排序,冒泡排序窃蹋。這三種排序的平均復(fù)雜度都是O(n^2)卡啰,實(shí)現(xiàn)起來(lái)簡(jiǎn)單,在小規(guī)模排序中有大量的應(yīng)用警没。其中插入排序由于其是穩(wěn)定的匈辱、原地的排序而受到廣大群眾的歡迎。在其基礎(chǔ)上衍生出來(lái)的高級(jí)版本---"希爾排序"則是效率更高的插入排序杀迹。
但是如果數(shù)據(jù)量非常大亡脸,O(n^2)的時(shí)間復(fù)雜度我們似乎也不太能接受,這樣我們又引申出了一些時(shí)間復(fù)雜度為O(nlogn)的排序算法,其中最常見(jiàn)的就是我們今天的兩個(gè)主角:歸并排序與快速排序浅碾。
再往上走大州,似乎O(nlogn)的算法也不太滿足我們了。別擔(dān)心垂谢,我們還有O(n)的算法---桶排序厦画、計(jì)數(shù)排序等。這一類(lèi)算法做到了線性的時(shí)間復(fù)雜度滥朱,效率非常高根暑,但是其對(duì)數(shù)據(jù)的要求也相應(yīng)提高,并不是所有情況都可以使用焚虱。

2. 為什么要使用這種排序算法购裙?

現(xiàn)在我們對(duì)常見(jiàn)的排序算法有了一定的認(rèn)識(shí),那我們應(yīng)該如何來(lái)評(píng)判一個(gè)排序算法的好壞呢鹃栽?在特定的情況下躏率,我們又該如何選擇合適的算法呢?
通常來(lái)看民鼓,我認(rèn)為選擇排序算法時(shí)有幾點(diǎn)需要考慮:

  1. 時(shí)間復(fù)雜度薇芝。大多數(shù)情況下,這是一個(gè)決定性的因素丰嘉,至少可以幫助我們篩選掉大部分算法夯到。
  2. 空間復(fù)雜度。雖然現(xiàn)在的內(nèi)存不值錢(qián)了饮亏,而且得益于大部分語(yǔ)言都有的垃圾清除機(jī)制耍贾,空間復(fù)雜度可能不是我們首先需要考慮的條件。但是當(dāng)算法的空間使用量超出我們所希望的閾值路幸,甚至頻繁觸發(fā)了GC荐开,那我們就需要進(jìn)行仔細(xì)的評(píng)估了。PS: 對(duì)于空間復(fù)雜度為O(1)的排序算法我們稱之為原地排序简肴。
  3. 算法的穩(wěn)定性晃听。這里的穩(wěn)定性指的是元素之間的順序的穩(wěn)定性,舉個(gè)例子:
    1,8,3,2,8,6
    對(duì)于這樣一串?dāng)?shù)字砰识,我們按照從小到大進(jìn)行排序:
    1,2,3,6,8,8
    在原數(shù)組中能扒,存在兩個(gè)相同的元素8,一個(gè)在前一個(gè)在后辫狼,那么對(duì)于排序以后的數(shù)組初斑,如果這兩個(gè)8的先后位置沒(méi)有改變,那么這次排序是穩(wěn)定的膨处。
    可能有朋友會(huì)覺(jué)得越平,這兩個(gè)8位置變不變有什么關(guān)系频蛔,反正都一樣。我們可以思考一下秦叛,如果我們排序的不是數(shù)字晦溪,而是一個(gè)對(duì)象。假如我們按照對(duì)象的A屬性對(duì)其排序挣跋,但是又希望在A屬性相同的條件下三圆,不改變?nèi)萜髦袑?duì)象之間原有的順序。這時(shí)算法的穩(wěn)定性就是一個(gè)重要的指標(biāo)了避咆。
    實(shí)際場(chǎng)景中舟肉,在對(duì)名字、手機(jī)號(hào)碼等進(jìn)行排序時(shí)查库,我們往往會(huì)需要一個(gè)穩(wěn)定的算法路媚。
  4. 數(shù)據(jù)規(guī)模。私以為這一點(diǎn)的重要性不亞于時(shí)間復(fù)雜度樊销,而且往往有一票否決權(quán)整慎。如果我們?cè)跀?shù)據(jù)量非常小的時(shí)候還是不顧一切選擇快排,那么快排中選擇pivot的操作所占的比重將會(huì)超出我們的預(yù)期围苫,導(dǎo)致其效率可能還不如O(n^2)的算法裤园。
    同樣舉個(gè)例子,我們?cè)贘ava開(kāi)發(fā)中剂府,對(duì)于數(shù)據(jù)的排序拧揽,只需要來(lái)一行Arrays.sort()就可以了,但是我們有沒(méi)有思考過(guò)腺占,為什么無(wú)論數(shù)據(jù)量大小淤袜,Arrays.sort()都能很快的運(yùn)行?它用的究竟是什么鬼才算法衰伯?
    源碼這里就不貼了饮怯,有興趣的朋友可以自行查看。這里我只將其中的主要邏輯進(jìn)行列舉(JDK 1.8):
  • 數(shù)據(jù)量小于47嚎研,使用插入排序。
  • 數(shù)據(jù)量小于286库倘,使用快排临扮。
  • 根據(jù)數(shù)據(jù)情況再選擇使用快排還是歸并排序。

可以看到強(qiáng)如Arrays.sort()這樣的工業(yè)級(jí)排序函數(shù)教翩,也并非是靠一個(gè)算法吃到底杆勇。

在什么情況下用什么工具?為什么要用饱亿?是我們?cè)诰幊踢^(guò)程中要不斷問(wèn)自己的兩個(gè)問(wèn)題蚜退。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闰靴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钻注,更是在濱河造成了極大的恐慌蚂且,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幅恋,死亡現(xiàn)場(chǎng)離奇詭異杏死,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)捆交,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)淑翼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人品追,你說(shuō)我怎么就攤上這事玄括。” “怎么了肉瓦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵遭京,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我风宁,道長(zhǎng)洁墙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任戒财,我火速辦了婚禮热监,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饮寞。我一直安慰自己孝扛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布幽崩。 她就那樣靜靜地躺著苦始,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慌申。 梳的紋絲不亂的頭發(fā)上陌选,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音蹄溉,去河邊找鬼咨油。 笑死,一個(gè)胖子當(dāng)著我的面吹牛柒爵,可吹牛的內(nèi)容都是我干的役电。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼棉胀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼法瑟!你這毒婦竟也來(lái)了冀膝?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤霎挟,失蹤者是張志新(化名)和其女友劉穎窝剖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體氓扛,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枯芬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了采郎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片千所。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蒜埋,靈堂內(nèi)的尸體忽然破棺而出淫痰,到底是詐尸還是另有隱情,我是刑警寧澤整份,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布待错,位于F島的核電站,受9級(jí)特大地震影響烈评,放射性物質(zhì)發(fā)生泄漏火俄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一讲冠、第九天 我趴在偏房一處隱蔽的房頂上張望瓜客。 院中可真熱鬧,春花似錦竿开、人聲如沸谱仪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疯攒。三九已至,卻和暖如春列荔,著一層夾襖步出監(jiān)牢的瞬間敬尺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工贴浙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砂吞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓悬而,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锭汛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子笨奠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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