數據結構-------排序算法詳解(面試必備)

數據結構——排序

對於各個排序的C++或者C的編程實現網上很容易找到,也有不少的帖子對這這些排序有總結,看了很多好多沒有將例子的過程寫清楚,僅僅是寫了排序思想或者排序過程很簡陋,不詳細。

1、插入排序–O(n^2)
插入排序是一種最簡單直觀的排序算法,它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。
算法步驟:
將第一待排序序列第一個元素看做一個有序序列,把第二個元素到最後一個元素當成是未排序序列。從頭到尾依次掃描未排序序列,將掃描到的每個元素插入有序序列的適當位置。(如果待插入的元素與有序序列中的某個元素相等,則將待插入元素插入到相等元素的後面。)
原始:5 4 1 3 6 7 8 2
第一趟:4 5 1 3 6 7 8 2
第二趟:1 4 5 3 6 7 8 2

2、希爾排序–O(nlog(n))
算法先將要排序的一組數按某個增量d分成若干組,每組中記錄的下標相差d.對每組中全部元素進行排序,然後再用一個較小的增量對它進行,在每組中再進行排序。當增量減到1時,整個要排序的數被分成一組,排序完成。
注意:增量的選擇尤爲重要,一種參考h=3*d+1進行迭代。
這裏寫圖片描述
說明一下:每一趟分組後進行排序,按照小到大順序,交換位置
第一趟中: 592 72交換位置,但是該數據在原始數據的位置仍然不變。
(1,592)—-(6,72)交換後(1,72)—(6,592)
第二趟中:(1,72)–(3,874)–(5,283)–(7,911)–(9,820)
交換排序後(1,72)–(3,283)–(5,820)–(7,874)–(9,911)

3、選擇排序—-O(n^2)
算法步驟:
1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
2)再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。
3)重複第二步,直到所有元素均排序完畢。
例子:5 8 3 6 4
第一趟:用除去第一個元素5以外的其餘元素的最小值(爲3)來與5比較,最小的交換(5>3)
3 8 5 6 4
第二趟:同理,用除去第二個元素8以外的其餘元素的最小值(爲4)來與8比較
3 4 5 6 8

4、冒泡排序—-O(n^2)
算法步驟:
1)比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2)對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
3)針對所有的元素重複以上的步驟,除了最後一個。
4)持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
5 3 8 4 7 假設從小到大,從後面第一個開始:
5 3 4 8 7
3 5 4 8 7 —-第一次排序結束,最小的在前面
3 5 4 7 8
3 4 5 7 8 —-第二次排序結束,第二最小排好
結束

5、快速排序–O(nlogn)
其實其思想是來自冒泡排序,冒泡排序是通過相鄰元素的比較和交換把最小的冒泡到最頂端,而快速排序是比較和交換小數和大數,這樣一來不僅把小數冒泡到上面同時也把大數沉到下面。
這裏寫圖片描述

6、歸併排序–O(nlogn)
歸併排序是另一種不同的排序方法,因爲歸併排序使用了遞歸分治的思想,所以理解起來比較容易。其基本思想是,先遞歸劃分子問題,然後合併結果。把待排序列看成由兩個有序的子序列,然後合併兩個子序列,然後把子序列看成由兩個有序序列。倒着來看,其實就是先兩兩合併,然後四四合並。。。最終形成有序序列。空間複雜度爲O(n),時間複雜度爲O(nlogn)。

7、堆排序
基本思想:
a.將無需序列構建成一個堆,根據升序降序需求選擇大頂堆或小頂堆;
b.將堆頂元素與末尾元素交換,將最大元素”沉”到數組末端;
c.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。

總結:常用的算法一般爲快速排序、歸併排序、希爾排序等。特別的,如果一個序列基本成有序,插入排序是最快的。

這裏寫圖片描述

申明:這個總結是看各位大佬的博客或者帖子總結的,如有侵犯請告知。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章