七大排序算法總結(java)


前面介紹了七大算法的思想與實現步驟,下面來作一個歸總。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];算法

  1. 首先有序區中的個數爲0,令i = 0。從無序區中選擇最小的數,加入到有序區a[i]中。使得有序區a[0..i],無序區a[i...n-1]
  2. 完成後 i++ ,而後繼續前面的步驟,直到 i = n-1 爲止。使得所有數都在有序區中。

冒泡排序

思想

冒泡排序主要是相鄰的兩個數兩兩進行比較,拿從小到大說明,進行冒泡排序後會將大的數到底部,將小得數到頂部。因此冒泡說法由此得名。數組

步驟

以從小到大爲例,排序數組大小爲n數據結構

  1. N = 0趟排序開始都從a[0]開始與其下面的相鄰的數進行比較,若是大於相鄰的數則交換他們的位置。
  2. 繼續與下一個相鄰的數進行比較,大於相鄰的就交換,最後進行比較n-1次後,第N = 0趟排序結束,最大的數就在數組的a[n-1]處。
  3. 重複前面的步驟,直到 N = n-1,排序結束。

直接插入排序

思想

直接插入排序的基本思想是:將須要排序的關鍵數與前面已經排好序的數據從後往前進行比較,使其插入到合適的位置spa

步驟

排序數組爲a[0...n]code

  1. a[0]做爲起始數據,從a[1]開始做爲關鍵字向前進行比較,若小於前面所遇到的比較數,則交換兩個比較數的位置,不然直接進行下一個關鍵字的比較。
  2. 重複前面的步驟,直到將a[n]做爲關鍵字進行比較。比較完之後則排序結束。

歸併排序

思想

歸併排序是一個效率相對較高的排序算法,它採用的是分治的思想,將待排序的序列分紅若干組,保證每組都有序,而後再進行合併排序,最終使整個序列有序。排序

步驟

  1. 將待排序的序列採用分治思想將其劃分紅若干組,使其有序,其中可採用遞歸進行劃分。
  2. 將有序的組分別進行歸併操做,其中藉助一個輔助數組,將左右劃分的有序組從頭開始進行比較,將較小的數加入到輔助數組中,且較小的所在有序數組向後自增,再與原來比較的數進行比較。
  3. 重複上面2的步驟,直到全部數據比較完畢,或者將還有剩餘數未比較的有序數據直接按原有的順序加入到輔助數組中,最後將已經排好序的輔助數組加入到原有數組的相應位置。
  4. 重複上面的23步驟,直到全部的左右劃分歸併完畢。

快速排序

思想

快速排序的主要思想是:將一個待排序序列分紅兩個部分,以其中的一個數據做爲分界線,其中一部分小於這個分界線的數據,另外一部分大於這個分界線的數據。由於採用遞歸的思想,再對這兩個序列進行快速排序,直到因此的數據都是有序的遞歸

步驟

假設待排序的數組爲a[0...n-1]ip

  1. 通常都將第一個數a[i] (i = 0) 做爲關鍵數,即快速排序的分界數。先從數組的後面開始即初值j = n-1,逐個向前進行遍歷與選的的關鍵數進行比較(j--),若大於等於關鍵數則繼續遍歷,不然將其與關鍵數所在的位置進行交換,並中止遍歷且i++記錄此時的ij
  2. 中止前面的遍歷,再從數組的第i個位置開始向後進行遍歷,逐個與關鍵數進行比較(i++),若小於等於關鍵數則繼續遍歷,不然將其與關鍵數所在的位置進行交換,並中止遍歷且j--記錄此時的ij
  3. 重複上面的步驟,直到i==j就結束本次快速排序。
  4. 此時已經將其按關鍵數分紅兩個部分,再重複前面的步驟,對劃分的部分進行快速排序,直到劃分的組中的數據個數爲1即此時全部數據有序。

希爾排序

思想

希爾排序是記錄增量來進行分組,再對分組內部進行直接插入排序,隨着增量的不斷減少,直到增量減少到1時,即每一個分組中的數據量爲1,此時排序結束。

步驟

設待排序的數組爲a[0...n-1]

  1. 通常開始取增量數d=n/2。從a[0]~a[d-1]將數組中數據之間的間隔爲增量數d的倍數歸爲相同組。
  2. 依次對每組中的數據進行直接插入排序,使其有序。
  3. 再增量數d=d/2,重複上面的步驟,直到d=1爲止。

堆排序

思想

堆排序是採用樹的形式的數據結構來進行排序的,其中每個堆都是徹底二叉樹。堆排序分爲大根堆與小根堆,大根堆(小根堆)表示在徹底二叉樹中,所用的非葉子節點都大於等於(小於等於)他們左右子節點(存在)。因此堆的頂點不是最大數就是最小數。這樣的話咱們就能夠藉助這種性質,每次都取出大根堆(小根堆)的頂點數,造成有序序列

步驟

  1. 首先生成小根堆或大根堆,這裏以小根堆爲例。咱們能夠將每個非葉子節點都看作是一個最小的徹底二叉樹,將他們都生成小根堆,從最後一個非葉子節點開始,把其當作是根節點,逐步向前進行建立小根堆。
  2. 而後就是取出造成的小根堆得頂點值,將其與堆中第N(N=n)個節點互換位置,即a[N-1]
  3. 此時小根堆被破壞,再從新生產小根堆N--,但此時要生成的數的範圍爲a[0...N-1]
  4. 重複上面的步驟23,直到N=1,即a[0],排序結束。

若有不足之處歡迎指出,所有代碼已經放到github上,有須要的能夠下載。

github地址:https://github.com/idisfkj/Ar...

關注

clipboard.png

相關文章
相關標籤/搜索