先把話說在前頭,算法一個比較難的知識點,必須要很耐心地去理解其原理。
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):

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):
