Java常用的7大排序算法匯總

1.插入排序算法

插入排序的基本思想是在遍歷數(shù)組的過(guò)程中,假設(shè)在序號(hào) i 之前的元素即 [0..i-1] 都已經(jīng)排好序,本趟需要找到 i 對(duì)應(yīng)的元素 x 的正確位置 k ,并且在尋找這個(gè)位置 k 的過(guò)程中逐個(gè)將比較過(guò)的元素往后移一位,為元素 x “騰位置”,最后將 k 對(duì)應(yīng)的元素值賦為 x ,一般情況下,插入排序的時(shí)間復(fù)雜度和空間復(fù)雜度分別為 O(n2 ) 和 O(1)。

2.選擇排序算法

選擇排序的基本思想是遍歷數(shù)組的過(guò)程中,以 i 代表當(dāng)前需要排序的序號(hào),則需要在剩余的 [i…n-1] 中找出其中的最小值,然后將找到的最小值與 i 指向的值進(jìn)行交換。因?yàn)槊恳惶舜_定元素的過(guò)程中都會(huì)有一個(gè)選擇最大值的子流程,所以人們形象地稱(chēng)之為選擇排序。選擇排序的時(shí)間復(fù)雜度和空間復(fù)雜度分別為 O(n2 ) 和 O(1) 。

3.冒泡排序算法

冒泡排序是將比較大的數(shù)字沉在最下面,較小的浮在上面

4.快速排序算法

通過(guò)一趟排序?qū)⒋庞涗浄指畛瑟?dú)立的兩部分,其中一部分記錄的關(guān)鍵字均比另一部分的關(guān)鍵字小,則可以分別對(duì)這兩部分記錄繼續(xù)進(jìn)行排序,已達(dá)到整個(gè)序列有序的目的,本質(zhì)就是,找一個(gè)基位(樞軸,分水嶺,作用是左邊的都比它小,右邊的都比它大。

可隨機(jī),取名base,首先從序列最右邊開(kāi)始找比base小的,如果小,換位置,從而base移到剛才右邊(比較時(shí)比base小)的位置(記為臨時(shí)的high位),這樣base右邊的都比base大。然后,從序列的最左邊開(kāi)始找比base大的,如果大,換位置,從而base移動(dòng)到剛才左邊(比較時(shí)比base大)的位置(記為臨時(shí)的low位),這樣base左邊的都比base小,循環(huán)以上兩步,直到 low == heigh, 這使才真正的找到了樞軸,分水嶺. 返回這個(gè)位置,分水嶺左邊和右邊的序列,分別再來(lái)遞歸。


5.合并排序算法

歸并排序采用的是遞歸來(lái)實(shí)現(xiàn),屬于“分而治之”,將目標(biāo)數(shù)組從中間一分為二,之后分別對(duì)這兩個(gè)數(shù)組進(jìn)行排序,排序完畢之后再將排好序的兩個(gè)數(shù)組“歸并”到一起,歸并排序最重要的也就是這個(gè)“歸并”的過(guò)程,歸并的過(guò)程中需要額外的跟需要?dú)w并的兩個(gè)數(shù)組長(zhǎng)度一致的空間

6.希爾排序算法

希爾排序的誕生是由于插入排序在處理大規(guī)模數(shù)組的時(shí)候會(huì)遇到需要移動(dòng)太多元素的問(wèn)題。希爾排序的思想是將一個(gè)大的數(shù)組“分而治之”,劃分為若干個(gè)小的數(shù)組。

以 gap 來(lái)劃分,比如數(shù)組 [1, 2, 3, 4, 5, 6, 7, 8] ,如果以 gap = 2 來(lái)劃分,可以分為 [1, 3, 5, 7] 和 [2, 4, 6, 8] 兩個(gè)數(shù)組(對(duì)應(yīng)的,如 gap = 3 , 則劃分的數(shù)組為: [1, 4, 7] 、 [2, 5, 8] 、 [3, 6] )然后分別對(duì)劃分出來(lái)的數(shù)組進(jìn)行插入排序,待各個(gè)子數(shù)組排序完畢之后再減小 gap 值重復(fù)進(jìn)行之前的步驟,直至 gap = 1 ,即對(duì)整個(gè)數(shù)組進(jìn)行插入排序。

此時(shí)的數(shù)組已經(jīng)基本上快排好序了,所以需要移動(dòng)的元素會(huì)很小很小,解決了插入排序在處理大規(guī)模數(shù)組時(shí)較多移動(dòng)次數(shù)的問(wèn)題,希爾排序是插入排序的改進(jìn)版,在數(shù)據(jù)量大的時(shí)候?qū)π实奶嵘龓椭艽螅瑪?shù)據(jù)量小的時(shí)候建議直接使用插入排序就好了。

7.堆排序算法

本質(zhì)就是先構(gòu)造一個(gè)大頂堆,parent比children大,root節(jié)點(diǎn)就是最大的節(jié)點(diǎn) 把最大的節(jié)點(diǎn)(root)與尾節(jié)點(diǎn)(最后一個(gè)節(jié)點(diǎn),比較小)位置互換,剩下最后的尾節(jié)點(diǎn),現(xiàn)在最大,其余的,從第一個(gè)元素開(kāi)始到尾節(jié)點(diǎn)前一位,構(gòu)造大頂堆遞歸。

最新的TIOBE指數(shù)顯示,Java編程已經(jīng)超過(guò)了20%的普及門(mén)檻,這意味著每五行源代碼當(dāng)中就有一行采用Java編寫(xiě)。這不是Java語(yǔ)言有史以來(lái)最高分,它曾在多年前和C與C++語(yǔ)言競(jìng)爭(zhēng)當(dāng)中失去了頭把交椅,但現(xiàn)在可能已經(jīng)卷土重來(lái)。

學(xué)習(xí)Java的同學(xué)注意了?。?!

學(xué)習(xí)過(guò)程中遇到什么問(wèn)題或者想獲取學(xué)習(xí)資源的話(huà),歡迎加入Java學(xué)習(xí)交流群346942462,我們一起學(xué)Java!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 排序的基本概念 在計(jì)算機(jī)程序開(kāi)發(fā)過(guò)程中,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個(gè)關(guān)鍵字進(jìn)行排序,排序完成的序列可用于快...
    Jack921閱讀 1,566評(píng)論 1 4
  • 總結(jié)一下常見(jiàn)的排序算法。 排序分內(nèi)排序和外排序。內(nèi)排序:指在排序期間數(shù)據(jù)對(duì)象全部存放在內(nèi)存的排序。外排序:指在排序...
    jiangliang閱讀 1,516評(píng)論 0 1
  • Ba la la la ~ 讀者朋友們,你們好啊,又到了冷鋒時(shí)間,話(huà)不多說(shuō),發(fā)車(chē)! 1.冒泡排序(Bub...
    王飽飽閱讀 1,894評(píng)論 0 7
  • 概述排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的...
    Luc_閱讀 2,371評(píng)論 0 35
  • 她與同事走在夜深人靜的街道上,暗黃的路燈昏昏欲睡,看了看手表,凌晨2點(diǎn)25分。再向前一點(diǎn),只要800米,就可以到租...
    黎夜行閱讀 251評(píng)論 0 0

友情鏈接更多精彩內(nèi)容