快速串講校招高頻面試題——排序演算法和複雜度

萬貓學社發表於2021-04-20

在校招面試中,排序演算法是經常被問到的。排序演算法又比較多,很容易遺忘和混淆。建議收藏起來,面試前可以快速過一遍。正所謂:臨陣磨槍,不快也光。

氣泡排序

重複地遍歷要排序的陣列,一次比較前後兩個數,如果它們的順序錯誤就把它們交換過來。因為越小的數會在交換過程中慢慢“浮”到陣列的頂端,所以被稱作氣泡排序。具體過程如下:

  1. 比較相鄰的數,如果第一數個比第二數個大,就交換它們兩個。
  2. 對每一對相鄰數作同樣的上述操作,從開始第一對到結尾的最後一對,這樣在最後的數就是最大的數。
  3. 針對所有的數重複上面的步驟,除了最後一個數(因為最後一個數已經是最大的了)。
  4. 對越來越少的數重複步驟上面的步驟,直到整個陣列排序完成。

文章持續更新,微信搜尋「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。

快速排序

通過一次排序將待排序的陣列分隔成兩個子陣列,一個子陣列的數都比另一子陣列的數小,則可分別對這兩部分繼續進行排序,最後使整個陣列都有序。具體過程如下:

  1. 選擇一個基準數,通常是陣列的第1個數。
  2. 重新排序陣列,所有數比基準數小的挪放在基準數前面,所有數比基準數大的挪在基準數的後面。
  3. 在這個排序之後,該基準數就處於陣列有序後的正確位置。
  4. 把基準數前後兩個子陣列,按照上述步驟繼續排序,直到整個陣列有序。

插入排序

在要排序的陣列中,先把第1個位置數看成是一個有序的子陣列,然後從第2個數逐個進行插入,直到整個陣列有序為止。

希爾排序

希爾排序是插入排序的升級版本,先把整個陣列分割為幾個子陣列進行插入排序,當整個陣列中的數基本有序時,再對整個陣列進行一次插入排序。具體過程如下:

  1. 選擇一個增量序列t1,t2,…,tk,其中ti > tj,tk = 1。比如:40、13、4、1。
  2. 按增量序列個數k,對序列進行k次插入排序。
  3. 每次插入排序,根據對應的增量ti,將陣列分割成幾個子序列,分別對各子陣列進行插入排序。當最後增量為1 時,對整個陣列作進行一次插入排序。

選擇排序

在要排序的陣列中,首先找出最小的一個數和第1個位置的數交換;然後在剩下的數中再找最小的數和第2個位置的數交換;依次類推,直到倒數第二個數和最後一個數進行比較為止。

文章持續更新,微信搜尋「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。

堆排序

堆排序是利用堆這種資料結構所設計的一種排序演算法。堆排序可以分為兩個階段:堆的構造階段、下沉排序階段。

在堆的構造階段中,我們將原始陣列重新組織安排進一個堆中;然後在下沉排序階段,我們從堆中按遞減順序取出所有元素並得到排序結果。

歸併排序

把兩個有序的陣列合併成一個有序的陣列。也就是說,把要排序的陣列分成兩個子陣列,當每個子陣列是有序的時候,再把這兩個子陣列合併成為整個陣列,也叫做二路歸併排序。如果把要排序的陣列分成多個子陣列,就叫做多路歸併排序。

計數排序

計數排序使用了一個額外的陣列 ,其中第i個數是待排序陣列中數等於i的個數。然後根據這個額外的陣列來將待排序陣列中的數排到正確的位置。

桶排序

桶排序是將待排序陣列分到有限數量的桶裡,然後再使用桶排序或者其他的排序演算法對每個桶再分別進行排序。

基數排序

基數排序是把整數按位數切割成不同的數字,然後按每個位數分別比較。按照低位先排序,然後收集;再按照高位排序,然後再收集;依次類推,直到最高位。

文章持續更新,微信搜尋「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。

排序演算法總結

複雜度總結

排序演算法 時間複雜度(平均) 時間複雜度(最壞) 時間複雜度(最好) 空間複雜度 穩定性
氣泡排序 O(n²) O(n²) O(n) O(1)
快速排序 O(n log n) O(n²) O(n log n) O(log n) ×
插入排序 O(n²) O(n²) O(n) O(1)
希爾排序 O(n log n) O(n²) O(n) O(1) ×
選擇排序 O(n²) O(n²) O(n²) O(1) ×
堆排序 O(n log n) O(n log n) O(n log n) O(1) ×
歸併排序 O(n log n) O(n log n) O(n log n) O(n)
計數排序 O(n + k) O(n + k) O(n + k) O(n + k)
桶排序 O(n + k) O(n + k) O(n²) O(n + k)
基數排序 O(n * k) O(n * k) O(n * k) O(n + k)

微信公眾號:萬貓學社

微信掃描二維碼

關注後回覆「電子書」

獲取12本Java必讀技術書籍

快速串講校招高頻面試題——排序演算法和複雜度

相關文章