資料結構 排序演算法詳解(面試必備)

2021-08-27 03:10:02 字數 2369 閱讀 7108

對於各個排序的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.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。

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

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

面試必備資料結構與演算法

一 資料結構 1 概念 a 資料之間的關係,提高程式效率 1 邏輯關係 人為認為 1 集合 在乙個範圍內由多個資料,資料之間沒有關係 2 線性 1對1關係 3 樹型 1對多 4 圖 多對多 2 物理關係 記憶體儲存 1 順序儲存 陣列 效率高但是長度是固定的 2 鏈式儲存 鍊錶 演算法 大數字運算 ...

資料結構與演算法之排序詳解

一 排序演算法分類 非線性時間比較類排序 通過比較來決定元素間的相對次序,由於其時間複雜度不能突破o nlogn 因此稱為非線性時間比較類排序。線性時間非比較類排序 不通過比較來決定元素間的相對次序,它可以突破基於比較排序的時間下界,以線性時間執行,因此稱為線性時間非比較類排序。二 排序演算法複雜度...

資料結構 選擇排序演算法和希爾排序演算法詳解

選擇排序演算法是經典演算法之一,你可以想象你在打牌,每次拿到的一張牌就是待排序的一張,你需要每一次跟之前的牌進行比較,然後將這張牌插入到合適的位置。那麼選擇排序也是一樣,將整個陣列看成兩個部分,有序部分和無序部分。現在需要將無序部分的數字跟有序部分進行比較,插入到正確的位置 下列 是插入排序的內層迴...