數據結構篇——常見排序算法核心思想簡單梳理

排序算法核心思想總結

emmm 寫的比較簡單,不適合新手看。適合已經手寫過一遍的人複習用。

冒泡排序

核心思想

  1. 兩個循環讓最小的數一直往上移動
  2. 最小的,第二小的。。。循環到最後就已經排好序了

選擇排序

核心思想

  1. 找出數組中最小的一個數
  2. 與數組中第一個交換
  3. 以此類推,找第二個。。。循環到整個數組結束

插入排序

核心思想

  1. 把數組看做左右兩份。左邊是有序的,右邊是無序的。
  2. 從左向右遍歷右數組(一開始左數組長度爲1,右數組長度爲N-1),如果右數組的第一個數小於左數組的最後一個數(從小到大排序),則說明需要把這個數插入到左數組的相應位置中。左數組的部分值需要右移。
  3. 這樣一次操作以後左數組長度++,右數組長度–
  4. 循環操作直到整個數組變成左數組

希爾排序(插入排序的優化版)

核心思想

  1. 假設數組長度爲N,引入一個間隔因數M。則數組可以被分作N/M份(假設數組爲[1,2,3,4]。N=4,設M=2。則數組可以被分作兩份:[1,3],[2,4];並不是[1,2]和[3,4]]
  2. 對於被分割之後的數組A(1),A(2)…A(N/M)分別進行插入排序
  3. 逐漸縮小M 直到M<1,結束排序(希爾排序的正確性保障,就是當M=1時,相當於對全數組來了一次插入排序)

歸併排序

核心思想

對於多個有序數組,將它們合併成一個有序數組

對於無序數組使用歸併排序:

  1. 將一個無序數組分解成多個無序的數組(遞歸)
  2. 由於遞歸到最後,最小粒度是1, 則能保證在遞歸拆分過程中每一個間隔爲1的數組是有序的。
  3. 遞歸回溯的時候,會進行粒度大於1的數組排序。假設粒度爲2,此時把數組看做兩份, 由3可知這兩份獨立起來看都是有序數組,把這兩份數組歸併成一份有序數組
  4. 一直回溯

快速排序

核心思想

  1. 將原來的無序數組看做左右兩份
  2. 選中一個基準值(往往是n[0],要求左數組的所有值比n[0]小,右數組的所有值都比n[0]大)。此時左右數組都可能是無序數組
  3. 遞歸調用,拆分左右數組,直到數組粒度足夠小(往往是1)

桶排序

核心思想

  1. 初始化10個隊列
  2. 取每個數的個位。0就放0號隊列,1就放1號隊列。。。
  3. 按照012…的隊列順序從10個隊列中取出數據(因爲要先入先出,所以是隊列)
  4. 接着取每個數的百位。0就放0號隊列,1就放1號隊列。。。
  5. 步驟3
  6. 。。。直到循環到所有數都在0號隊列 說明已經到了最大了 。按照FIFO的順序取出來,就是已經排好序的數組了

堆排序

核心思想

大頂堆概念:根節點比子節點都要大的二叉樹
順序存儲二叉樹:一種可以用數組來表示的二叉樹。所有對二叉樹的操作,本質上都是在對於數組進行操作

  1. 構建大頂堆
  2. 把二叉樹的根節點與最後一個節點交換位置
  3. 除去第一個樹,繼續構建大頂堆
  4. 。。。。重複步驟 直到樹中剩下最後一個值
  5. 由於使用順序存儲二叉樹,所以結果就是一個數組。無序遍歷二叉樹得到最後結果
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章