1. 簡介
本文對常見排序算法進行總結
2. 排序算法
2.1 冒泡排序
該算法比較簡單,幾乎所有語言涉及到算法時,都會涉及到冒泡算法。
算法思路:
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
- 針對所有的元素重複以上的步驟,除了最後一個。
持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
2.2 選擇排序
每次選擇一個最大(小)的,直到所有元素都被輸出。
可參考:https://blog.csdn.net/sun7545526/article/details/85165618
2.3 直接插入排序
插入排序的基本方法是:每一步將一個待排序的元素,按其排序碼的大小,插入到前面已經排好序的一組元素的適當位置上去,直到元素全部插入爲止
算法思路:
當插入第i(i >= 1)時,前面的V[0],V[1],……,V[i-1]已經排好序。這時,用V[I]的排序碼與V[i-1],V[i-2],…的排序碼順序進行比較,找到插入位置即將V[i]插入,原來位置上的元素向後順移。
以[21,25,49,25,16,08]爲例,排序過程如下所示:
在小規模數據集或是基本有序時,該算法效率較高。
2.4 希爾排序
先對數據進行預處理,使其基本有序,然後再用直接插入排序算法排序。
詳細過程可參考:https://blog.csdn.net/eric_sunah/article/details/103080731
2.5 快速排序
利用“分而治之”的思想對集合進行排序
可參考:https://blog.csdn.net/sun7545526/article/details/85165742
2.6 堆排序
說堆排序前,先說下啥是堆。
堆:堆是滿足下列性質的完全二叉樹:
- 每個節點都大於或是等於其左右孩子節點的值,稱爲大頂堆
- 每個節點都小於或是等於其左右孩子節點的值,稱爲小頂堆
接下來說下堆是如何做排序的,思路如下(以大頂堆爲例):
- 根節點是整個堆的最大值,將他移走。
- 將剩餘n-1個節點重新構造成一個堆,再將根節點移走
- 重複執行1,2。直到沒有節點可移動,就生成了有序序列。
該算法有兩個需要解決問題:
- 如何將一個無序序列構建一個堆。
- 移除根節點後,如何用剩餘的節點重建堆。
詳細介紹參見:https://blog.csdn.net/eric_sunah/article/details/103081878
2.7 歸併排序
歸併排序(MERGE-SORT)是利用歸併的思想實現的排序方法,該算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞歸求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。
詳細介紹參見:https://blog.csdn.net/eric_sunah/article/details/103082607
3. 總結
分類總結:
時間複雜度總結: