排序算法核心思想總結
emmm 寫的比較簡單,不適合新手看。適合已經手寫過一遍的人複習用。
冒泡排序
核心思想
- 兩個循環讓最小的數一直往上移動
- 最小的,第二小的。。。循環到最後就已經排好序了
選擇排序
核心思想
- 找出數組中最小的一個數
- 與數組中第一個交換
- 以此類推,找第二個。。。循環到整個數組結束
插入排序
核心思想
- 把數組看做左右兩份。左邊是有序的,右邊是無序的。
- 從左向右遍歷右數組(一開始左數組長度爲1,右數組長度爲N-1),如果右數組的第一個數小於左數組的最後一個數(從小到大排序),則說明需要把這個數插入到左數組的相應位置中。左數組的部分值需要右移。
- 這樣一次操作以後左數組長度++,右數組長度–
- 循環操作直到整個數組變成左數組
希爾排序(插入排序的優化版)
核心思想
- 假設數組長度爲N,引入一個間隔因數M。則數組可以被分作N/M份(假設數組爲[1,2,3,4]。N=4,設M=2。則數組可以被分作兩份:[1,3],[2,4];並不是[1,2]和[3,4]])
- 對於被分割之後的數組A(1),A(2)…A(N/M)分別進行插入排序
- 逐漸縮小M 直到M<1,結束排序(希爾排序的正確性保障,就是當M=1時,相當於對全數組來了一次插入排序)
歸併排序
核心思想
對於多個有序數組,將它們合併成一個有序數組
對於無序數組使用歸併排序:
- 將一個無序數組分解成多個無序的數組(遞歸)
- 由於遞歸到最後,最小粒度是1, 則能保證在遞歸拆分過程中每一個間隔爲1的數組是有序的。
- 遞歸回溯的時候,會進行粒度大於1的數組排序。假設粒度爲2,此時把數組看做兩份, 由3可知這兩份獨立起來看都是有序數組,把這兩份數組歸併成一份有序數組
- 一直回溯
快速排序
核心思想
- 將原來的無序數組看做左右兩份
- 選中一個基準值(往往是n[0],要求左數組的所有值比n[0]小,右數組的所有值都比n[0]大)。此時左右數組都可能是無序數組
- 遞歸調用,拆分左右數組,直到數組粒度足夠小(往往是1)
桶排序
核心思想
- 初始化10個隊列
- 取每個數的個位。0就放0號隊列,1就放1號隊列。。。
- 按照012…的隊列順序從10個隊列中取出數據(因爲要先入先出,所以是隊列)
- 接着取每個數的百位。0就放0號隊列,1就放1號隊列。。。
- 步驟3
- 。。。直到循環到所有數都在0號隊列 說明已經到了最大了 。按照FIFO的順序取出來,就是已經排好序的數組了
堆排序
核心思想
大頂堆概念:根節點比子節點都要大的二叉樹
順序存儲二叉樹:一種可以用數組來表示的二叉樹。所有對二叉樹的操作,本質上都是在對於數組進行操作
- 構建大頂堆
- 把二叉樹的根節點與最後一個節點交換位置
- 除去第一個樹,繼續構建大頂堆
- 。。。。重複步驟 直到樹中剩下最後一個值
- 由於使用順序存儲二叉樹,所以結果就是一個數組。無序遍歷二叉樹得到最後結果