前面介紹了七大算法的思想與實現步驟,下面來作一個歸總。git
排序方法 | 平均複雜度 | 最壞複雜度 | 最好複雜度 | 輔助空間 | 穩定性 | |
---|---|---|---|---|---|---|
直接選擇排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 穩定 | |
冒泡排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 穩定 | |
直接插入排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 穩定 | |
歸併排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 穩定 | |
快速排序 | O(nlogn) | O(n^2) | O(nlogn) | O(1) | 不穩定 | |
希爾排序 | O(nlogn)~O(n^2) | O(n^1.3) | O(n^2) | O(logn)~O(n) | 不穩定 | |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不穩定 |
直接選擇排序,總體思想是將數據分紅兩個區域,有序區
與無序區
。排序的時候是每次從無序區
中選擇出最小的數,而後插入到有序區
中的最末尾,從而造成更大的有序區
。直到無序區
中的數爲零,結束排序。github
假設排序數組爲a[0...n-1];算法
有序區
中的個數爲0,令i = 0
。從無序區
中選擇最小的數,加入到有序區a[i]
中。使得有序區
爲a[0..i]
,無序區
爲a[i...n-1]
i++
,而後繼續前面的步驟,直到 i = n-1
爲止。使得所有數都在有序區
中。冒泡排序主要是相鄰的兩個數兩兩進行比較,拿從小到大說明,進行冒泡排序後會將大的數沉
到底部,將小得數浮
到頂部。因此冒泡說法由此得名。數組
以從小到大爲例,排序數組大小爲n
。數據結構
N = 0
趟排序開始都從a[0]
開始與其下面的相鄰的數進行比較,若是大於相鄰的數則交換他們的位置。n-1
次後,第N = 0
趟排序結束,最大的數就在數組的a[n-1]
處。N = n-1
,排序結束。直接插入排序的基本思想是:將須要排序的關鍵數與前面已經排好序的數據從後往前進行比較,使其插入到合適的位置
。spa
排序數組爲a[0...n]
code
a[0]
做爲起始數據,從a[1]
開始做爲關鍵字向前進行比較,若小於前面所遇到的比較數,則交換兩個比較數的位置,不然直接進行下一個關鍵字的比較。a[n]
做爲關鍵字進行比較。比較完之後則排序結束。歸併排序是一個效率相對較高的排序算法,它採用的是分治的思想
,將待排序的序列分紅若干組,保證每組都有序,而後再進行合併排序,最終使整個序列有序。排序
分治思想
將其劃分紅若干組,使其有序,其中可採用遞歸進行劃分。2
的步驟,直到全部數據比較完畢,或者將還有剩餘數未比較的有序數據直接按原有的順序加入到輔助數組中,最後將已經排好序的輔助數組加入到原有數組的相應位置。2
、3
步驟,直到全部的左右劃分歸併完畢。快速排序的主要思想是:將一個待排序序列分紅兩個部分,以其中的一個數據做爲分界線,其中一部分小於這個分界線的數據,另外一部分大於這個分界線的數據。由於採用遞歸的思想,再對這兩個序列進行快速排序,直到因此的數據都是有序的
。遞歸
假設待排序的數組爲a[0...n-1]
ip
a[i]
(i = 0
) 做爲關鍵數,即快速排序的分界數。先從數組的後面開始即初值j = n-1
,逐個向前進行遍歷與選的的關鍵數進行比較(j--
),若大於等於關鍵數則繼續遍歷,不然將其與關鍵數所在的位置進行交換,並中止遍歷且i++
記錄此時的i
、j
。i
個位置開始向後進行遍歷,逐個與關鍵數進行比較(i++
),若小於等於關鍵數則繼續遍歷,不然將其與關鍵數所在的位置進行交換,並中止遍歷且j--
記錄此時的i
、j
。i==j
就結束本次快速排序。1
即此時全部數據有序。希爾排序是記錄增量來進行分組,再對分組內部進行直接插入排序,隨着增量的不斷減少,直到增量減少到1
時,即每一個分組中的數據量爲1
,此時排序結束。
設待排序的數組爲a[0...n-1]
d=n/2
。從a[0]~a[d-1]
將數組中數據之間的間隔爲增量數d
的倍數歸爲相同組。d=d/2
,重複上面的步驟,直到d=1
爲止。堆排序是採用樹的形式的數據結構來進行排序的,其中每個堆都是徹底二叉樹。堆排序分爲大根堆與小根堆,大根堆(小根堆)表示在徹底二叉樹中,所用的非葉子節點都大於等於(小於等於)他們左右子節點(存在)
。因此堆的頂點不是最大數就是最小數。這樣的話咱們就能夠藉助這種性質,每次都取出大根堆(小根堆)的頂點數,造成有序序列
。
N
(N=n)個節點互換位置,即a[N-1]
。N--
,但此時要生成的數的範圍爲a[0...N-1]
。2
、3
,直到N=1
,即a[0]
,排序結束。若有不足之處歡迎指出,所有代碼已經放到github上,有須要的能夠下載。
github地址:https://github.com/idisfkj/Ar...