排序算法

常見排序算法比較


各種常用排序算法比較

參考資料:各種排序算法比較

參考資料:快速排序算法

必須知道的八大種排序算法【java實現(xiàn)】(一) 冒泡排序挑随、快速排序?(這篇文章中存在部分錯誤折联,但是代碼示例較為完備肋坚,可以當(dāng)著示例來看)

算法復(fù)雜度和算法穩(wěn)定性的理解

時間復(fù)雜度:元素進(jìn)行比較和移動的次數(shù)宋列;

空間復(fù)雜度:算法執(zhí)行過程中,需要的輔助內(nèi)存情況惭嚣;

算法穩(wěn)定性:對于同值元素位置的改變情況決定姑廉,如果不改變缺亮,則屬于穩(wěn)定性好的算法,否則為不穩(wěn)定的算法桥言。

對冒泡排序算法最好情況下時間復(fù)雜度為O(n)的理解萌踱,及時間復(fù)雜度的具體算法:冒泡排序最佳情況的時間復(fù)雜度,為什么是O(n)

下面是冒泡排序算法的示例:

示例代碼

參考git倉庫:

關(guān)鍵點

各種排序算法在:時間算法復(fù)雜度限书、空間復(fù)雜度虫蝶、算法穩(wěn)定性、算法難易度上各有所長倦西,需要根據(jù)場景來定能真;比如對大部分有序的場景,采用插入排序/冒泡排序算法扰柠;對于數(shù)據(jù)量大時粉铐,對時間敏感的情況下,使用歸并排序/快排算法合適卤档;對于對內(nèi)存敏感的場景蝙泼,則不宜選用歸并排序/快排算法,可采用shell排序劝枣。

歸并排序算法時間復(fù)雜度上穩(wěn)定汤踏,為O(nlog2n)织鲸,但是空間復(fù)雜度較高,通常為O(n)溪胶;如果希望降低空間復(fù)雜度可以搂擦,采用原地歸并算法,可以將空間復(fù)雜度降低至O(nlogn),但是會損壞時間復(fù)雜度哗脖,所以需要在時間復(fù)雜度和空間復(fù)雜度上進(jìn)行折中瀑踢,根據(jù)具體應(yīng)用場景選擇;

快排算法才避,不穩(wěn)定橱夭,平均時間復(fù)雜度為O(nlog2n),空間復(fù)雜度為O(log2n) ~ O(n)桑逝,當(dāng)數(shù)據(jù)量大時優(yōu)勢明顯棘劣;當(dāng)數(shù)據(jù)量小時,通常采用插入排序算法肢娘。

jdk中的ArrayList.sort()方法

jdk1.6及其以前呈础,使用歸并排序算法;

jdk1.7橱健、1.8 默認(rèn)情況下使用TimSort,除非用戶顯式指定使用老式的歸并排序算法LegacyMergeSort時沙廉。

TimSort 綜合使用二分查找插入算法和歸并排序算法拘荡,以求性能上達(dá)到最佳。代碼分析參考:TimSort in Java 7

jdk中的sort方法體現(xiàn)了如下思路:

1撬陵、依據(jù)待排序數(shù)組的情況珊皿,選擇不同的排序算法;比如:當(dāng)待排序數(shù)組的大小小于設(shè)定值32時巨税,則直接使用二分查找插入算法蟋定,否則使用真正的TimSort排序。

2草添、TimSort排序的高明之處在于:特殊處理已排序的數(shù)組內(nèi)容驶兜,減小算法復(fù)雜度;分塊處理待排序數(shù)組远寸,確保每個元素最多移動的次數(shù)抄淑,不至于因為數(shù)組大小N增大,算法復(fù)雜度越來越大驰后;對塊進(jìn)行歸并處理肆资。

jdk中的Arrays.sort()方法

采用DualPivotQuicksort 雙軸快速排序算法。算法步驟:

1.對于很小的數(shù)組(長度小于27)灶芝,會使用插入排序郑原。

2.選擇兩個點P1,P2作為軸心唉韭,比如我們可以使用第一個元素和最后一個元素。

3.P1必須比P2要小犯犁,否則將這兩個元素交換属愤,現(xiàn)在將整個數(shù)組分為四部分:

(1)第一部分:比P1小的元素。

(2)第二部分:比P1大但是比P2小的元素栖秕。

(3)第三部分:比P2大的元素春塌。

(4)第四部分:尚未比較的部分。

在開始比較前簇捍,除了軸點只壳,其余元素幾乎都在第四部分,直到比較完之后第四部分沒有元素暑塑。

4.從第四部分選出一個元素a[K]吼句,與兩個軸心比較,然后放到第一二三部分中的一個事格。

5.移動L惕艳,K,G指向驹愚。

6.重復(fù) 4 5 步远搪,直到第四部分沒有元素。

7.將P1與第一部分的最后一個元素交換逢捺。將P2與第三部分的第一個元素交換谁鳍。

8.遞歸的將第一二三部分排序。

Java源碼解析-DualPivotQuicksort

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末劫瞳,一起剝皮案震驚了整個濱河市倘潜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌志于,老刑警劉巖涮因,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異伺绽,居然都是意外死亡养泡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門憔恳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓤荔,“玉大人,你說我怎么就攤上這事钥组∈湎酰” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵程梦,是天一觀的道長点把。 經(jīng)常有香客問我橘荠,道長,這世上最難降的妖魔是什么郎逃? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任哥童,我火速辦了婚禮,結(jié)果婚禮上褒翰,老公的妹妹穿的比我還像新娘贮懈。我一直安慰自己,他們只是感情好优训,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布朵你。 她就那樣靜靜地躺著,像睡著了一般揣非。 火紅的嫁衣襯著肌膚如雪抡医。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天早敬,我揣著相機(jī)與錄音忌傻,去河邊找鬼。 笑死搞监,一個胖子當(dāng)著我的面吹牛水孩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琐驴,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼荷愕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了棍矛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤抛杨,失蹤者是張志新(化名)和其女友劉穎够委,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怖现,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茁帽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了屈嗤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潘拨。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖饶号,靈堂內(nèi)的尸體忽然破棺而出铁追,到底是詐尸還是另有隱情,我是刑警寧澤茫船,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布琅束,位于F島的核電站扭屁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涩禀。R本人自食惡果不足惜料滥,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望艾船。 院中可真熱鬧葵腹,春花似錦、人聲如沸屿岂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雁社。三九已至浴井,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霉撵,已是汗流浹背磺浙。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留徒坡,地道東北人撕氧。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像喇完,于是被迫代替她去往敵國和親伦泥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

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