8大排序算法Java實現(xiàn)

先把話說在前頭,算法一個比較難的知識點,必須要很耐心地去理解其原理。

1.直接插入排序

直接插入排序是一種簡單的排序方法,也是后面排序算法的基礎(chǔ)。

算法步驟:

1)將第一待排序序列第一個元素看做一個有序序列,把第二個元素到最后一個元素當(dāng)成是未排序序列。

2)從頭到尾依次掃描未排序序列,將掃描到的每個元素插入有序序列的適當(dāng)位置。(如果待插入的元素與有序序列中的某個元素相等,則將待插入元素插入到相等元素的后面。)


直接插入排序

算法實現(xiàn):

直接插入排序

2.希爾排序

希爾排序,也稱遞減增量排序算法,就是直接插入排序的加強版,但是希爾排序并不穩(wěn)定(即是當(dāng)元素較多的時候就會失?。?。

算法步驟:

1)選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;

2)按增量序列個數(shù)k,對序列進行k 趟排序;

3)每趟排序,根據(jù)對應(yīng)的增量ti,將待排序列分割成若干長度為m 的子序列,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。


希爾排序

算法實現(xiàn):

希爾排序

3.簡單選擇排序

選擇排序(Selection sort)也是一種簡單直觀的排序算法。

算法步驟:

1)首先在未排序序列中找到最?。ù螅┰?,存放到排序序列的起始位置。

2)再從剩余未排序元素中繼續(xù)尋找最小(大)元素,然后放到已排序序列的末尾。

3)重復(fù)第二步,直到所有元素均排序完畢。


簡單選擇排序

算法實現(xiàn):

簡單選擇排序

4.冒泡排序

冒泡排序(Bubble Sort)也是一種簡單直觀的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個算法的名字由來是因為越小的元素會經(jīng)由交換慢慢“浮”到數(shù)列的頂端。

算法步驟:

1)比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

2)對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對。這步做完后,最后的元素會是最大的數(shù)。

3)針對所有的元素重復(fù)以上的步驟,除了最后一個。

4)持續(xù)每次對越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。


冒泡排序

算法實現(xiàn):

冒泡排序

5.快速排序

快速排序是由東尼·霍爾所發(fā)展的一種排序算法。在平均狀況下,排序 n 個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況并不常見。事實上,快速排序通常明顯比其他Ο(n log n) 算法更快,因為它的內(nèi)部循環(huán)(inner loop)可以在大部分的架構(gòu)上很有效率地被實現(xiàn)出來。遞歸的最底部情形,是數(shù)列的大小是零或一,也就是永遠都已經(jīng)被排序好了。雖然一直遞歸下去,但是這個算法總會退出,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最后的位置去。

算法步驟:

1 從數(shù)列中挑出一個元素,稱為 “基準(zhǔn)”(pivot)。

2?重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個稱為分區(qū)(partition)操作。

3?遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。

快速排序

算法實現(xiàn):

快速排序

6.歸并排序

歸并排序(Merge sort)是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應(yīng)用。

算法步驟:

1. 申請空間,使其大小為兩個已經(jīng)排序序列之和,該空間用來存放合并后的序列。

2. 設(shè)定兩個指針,最初位置分別為兩個已經(jīng)排序序列的起始位置。

3. 比較兩個指針?biāo)赶虻脑兀x擇相對小的元素放入到合并空間,并移動指針到下一位置。

4. 重復(fù)步驟3直到某一指針達到序列尾。

5. 將另一序列剩下的所有元素直接復(fù)制到合并序列尾。


歸并排序

算法實現(xiàn):


歸并排序

7.基數(shù)排序

基數(shù)排序是一種非比較型整數(shù)排序算法,其原理是將整數(shù)按位數(shù)切割成不同的數(shù)字,然后按每個位數(shù)分別比較。由于整數(shù)也可以表達字符串(比如名字或日期)和特定格式的浮點數(shù),所以基數(shù)排序也不是只能使用于整數(shù)。

算法步驟:

1)先找出待排序數(shù)組的最大值,確定有多少位,確定要排多少次。

2)創(chuàng)建二維數(shù)組temp[10][arrs.length]來存放每次排序好的元素。

3)每次排序好,遍歷二維數(shù)組取回到arrs[]中。

算法實現(xiàn):

基數(shù)排序

8.堆排序

堆排序(Heapsort)是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計的一種排序算法。堆積是一個近似完全二叉樹的結(jié)構(gòu),并同時滿足堆積的性質(zhì):即子結(jié)點的鍵值或索引總是小于(或者大于)它的父節(jié)點。

算法步驟:

1)創(chuàng)建一個堆H[0..n-1]。

2)把堆首(最大值)和堆尾互換。

3)把堆的尺寸縮小1,并調(diào)用shift_down(0),目的是把新的數(shù)組頂端數(shù)據(jù)調(diào)整到相應(yīng)位置。

4) 重復(fù)步驟2,直到堆的尺寸為1。

堆排序

算法實現(xiàn):

堆排序

總結(jié),恭喜你已經(jīng)理解了八大排序算法。

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

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

  • 一、直接插入排序 直接插入排序(Insertion Sort)的基本思想是:每次將一個待排序的元素記錄,按其關(guān)鍵字...
    kevin16929閱讀 645評論 0 0
  • 作者:快課網(wǎng)——Jay13原文地址:http://www.cricode.com/3212.html 排序算法可以...
    IT程序獅閱讀 3,836評論 2 78
  • 概述排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的...
    Luc_閱讀 2,371評論 0 35
  • (二) 在內(nèi)府掌印曹吉祥等人的護駕下,馬隊從東華門長驅(qū)直入,沒有遇到任何阻攔,只是速度有所減慢??缭浇鹚畼驎r,馬蹄...
    王家老四1閱讀 584評論 0 0
  • ReactNative 頁面跳轉(zhuǎn)的功能著實坑了我兩天 . 今天終于調(diào)試好了 , 在此分享一下 . 學(xué)習(xí)新技術(shù)我一貫...
    KumLight閱讀 4,225評論 2 7

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