十大经典算法图解(详细版)
術語鋪墊
什么是穩定排序、原地排序、時間復雜度、空間復雜度,先簡單解釋一下:
1、穩定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,則為穩定排序。
2、非穩定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,則為非穩定排序。
3、原地排序:原地排序就是指在排序過程中不申請多余的存儲空間,只利用原來存儲待排數據的存儲空間進行比較和交換的數據排序。
4、非原地排序:需要利用額外的數組來輔助排序。
5、時間復雜度:一個算法執行所消耗的時間。
6、空間復雜度:運行完一個算法所需的內存大小。
十大排序算法講解
1、選擇排序
選擇排序
插入排序
冒泡排序
非優化版本
優化版本
希爾排序
歸并排序
遞歸式歸并排序
非遞歸式歸并排序
快速排序
堆排序
基數排序
非優化版本
優化版本
桶排序
基數排序
過程簡單描述:
首先,找到數組中最小的那個元素,其次,將它和數組的第一個元素交換位置(如果第一個元素就是最小元素那么它就和自己交換)。其次,在剩下的元素中找到最小的元素,將它與數組的第二個元素交換位置。如此往復,直到將整個數組排序。這種方法我們稱之為選擇排序。
選擇排序圖解如下:
性質:
1、時間復雜度:O(n2)
2、空間復雜度:O(1)
3、非穩定排序
4、原地排序
2、插入排序
我們在玩打牌的時候,你是怎么整理那些牌的呢?一種簡單的方法就是一張一張的來,將每一張牌插入到其他已經有序的牌中的適當位置。當我們給無序數組做排序的時候,為了要插入元素,我們需要騰出空間,將其余所有元素在插入之前都向右移動一位,這種算法我們稱之為插入排序。
過程簡單描述:
1、從數組第2個元素開始抽取元素。
2、把它與左邊第一個元素比較,如果左邊第一個元素比它大,則繼續與左邊第二個元素比較下去,直到遇到不比它大的元素,然后插到這個元素的右邊。
3、繼續選取第3,4,….n個元素,重復步驟 2 ,選擇適當的位置插入。
插入排序圖解:
性質:1、時間復雜度:O(n2) 2、空間復雜度:O(1) 3、穩定排序 4、原地排序
3、冒泡排序
1、把第一個元素與第二個元素比較,如果第一個比第二個大,則交換他們的位置。接著繼續比較第二個與第三個元素,如果第二個比第三個大,則交換他們的位置….
我們對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對,這樣一趟比較交換下來之后,排在最右的元素就會是最大的數。
除去最右的元素,我們對剩余的元素做同樣的工作,如此重復下去,直到排序完成。
圖:
性質:1、時間復雜度:O(n2) 2、空間復雜度:O(1) 3、穩定排序 4、原地排序
優化冒泡排序的算法
假如從開始的第一對到結尾的最后一對,相鄰的元素之間都沒有發生交換的操作,這意味著右邊的元素總是大于等于左邊的元素,此時的數組已經是有序的了,我們無需再對剩余的元素重復比較下去了
4、希爾排序
希爾排序可以說是插入排序的一種變種。無論是插入排序還是冒泡排序,如果數組的最大值剛好是在第一位,要將它挪到正確的位置就需要 n - 1 次移動。也就是說,原數組的一個元素如果距離它正確的位置很遠的話,則需要與相鄰元素交換很多次才能到達正確的位置,這樣是相對比較花時間了。
希爾排序就是為了加快速度簡單地改進了插入排序,交換不相鄰的元素以對數組的局部進行排序。
希爾排序的思想是采用插入排序的方法,先讓數組中任意間隔為 h 的元素有序,剛開始 h 的大小可以是 h = n / 2,接著讓 h = n / 4,讓 h 一直縮小,當 h = 1 時,也就是此時數組中任意間隔為1的元素有序,此時的數組就是有序的了。
圖:
需要注意的是,對各個分組進行插入的時候并不是先對一個組排序完了再來對另一個組排序,而是輪流對每個組進行排序。
性質:1、時間復雜度:O(nlogn) 2、空間復雜度:O(1) 3、非穩定排序 4、原地排序
5、歸并排序
將一個大的無序數組有序,我們可以把大的數組分成兩個,然后對這兩個數組分別進行排序,之后在把這兩個數組合并成一個有序的數組。由于兩個小的數組都是有序的,所以在合并的時候是很快的。
通過遞歸的方式將大的數組一直分割,直到數組的大小為 1,此時只有一個元素,那么該數組就是有序的了,之后再把兩個數組大小為1的合并成一個大小為2的,再把兩個大小為2的合并成4的 …… 直到全部小的數組合并起來。
圖:
性質:1、時間復雜度:O(nlogn) 2、空間復雜度:O(n) 3、穩定排序 4、非原地排序
6、快速排序
我們從數組中選擇一個元素,我們把這個元素稱之為中軸元素吧,然后把數組中所有小于中軸元素的元素放在其左邊,所有大于或等于中軸元素的元素放在其右邊,顯然,此時中軸元素所處的位置的是有序的。也就是說,我們無需再移動中軸元素的位置。
從中軸元素那里開始把大的數組切割成兩個小的數組(兩個數組都不包含中軸元素),接著我們通過遞歸的方式,讓中軸元素左邊的數組和右邊的數組也重復同樣的操作,直到數組的大小為1,此時每個元素都處于有序的位置。
圖:
性質:1、時間復雜度:O(nlogn) 2、空間復雜度:O(logn) 3、非穩定排序 4、原地排序
7、堆排序
堆的特點就是堆頂的元素是一個最值,大頂堆的堆頂是最大值,小頂堆則是最小值。
堆排序就是把堆頂的元素與最后一個元素交換,交換之后破壞了堆的特性,我們再把堆中剩余的元素再次構成一個大頂堆,然后再把堆頂元素與最后第二個元素交換….如此往復下去,等到剩余的元素只有一個的時候,此時的數組就是有序的了。
圖:
性質:1、時間復雜度:O(nlogn) 2、空間復雜度:O(1) 3、非穩定排序 4、原地排序
8、計數排序
計數排序是一種適合于最大值和最小值的差值不是不是很大的排序。
基本思想:就是把數組元素作為數組的下標,然后用一個臨時數組統計該元素出現的次數,例如 temp[i] = m, 表示元素 i 一共出現了 m 次。最后再把臨時數組統計的數據從小到大匯總起來,此時匯總起來是數據是有序的。
圖:
性質:1、時間復雜度:O(n+k) 2、空間復雜度:O(k) 3、穩定排序 4、非原地排序
注:K表示臨時數組的大小,下同
9、桶排序
桶排序就是把最大值和最小值之間的數進行瓜分,例如分成 10 個區間,10個區間對應10個桶,我們把各元素放到對應區間的桶中去,再對每個桶中的數進行排序,可以采用歸并排序,也可以采用快速排序之類的。
之后每個桶里面的數據就是有序的了,我們在進行合并匯總。
圖片:
性質:1、時間復雜度:O(n+k) 2、空間復雜度:O(n+k) 3、穩定排序 4、非原地排序
注:k 表示桶的個數,下同
10、基數排序
基數排序的排序思路是這樣的:先以個位數的大小來對數據進行排序,接著以十位數的大小來多數進行排序,接著以百位數的大小……
排到最后,就是一組有序的元素了。不過,他在以某位數進行排序的時候,是用“桶”來排序的。
由于某位數(個位/十位….,不是一整個數)的大小范圍為0-9,所以我們需要10個桶,然后把具有相同數值的數放進同一個桶里,之后再把桶里的數按照0號桶到9號桶的順序取出來,這樣一趟下來,按照某位數的排序就完成了
圖:
性質:1、時間復雜度:O(kn) 2、空間復雜度:O(n+k) 3、穩定排序 4、非原地排序
總結
用一張圖匯總了10大排序算法的性質
————————————————
版權聲明:本文為CSDN博主「鵬燕1369」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_23488347/article/details/88808343
總結
以上是生活随笔為你收集整理的十大经典算法图解(详细版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: simplified build con
- 下一篇: 序列化与反序列化(1)Serializa