對於各個排序的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 因此稱為非線性時間比較類排序。線性時間非比較類排序 不通過比較來決定元素間的相對次序,它可以突破基於比較排序的時間下界,以線性時間執行,因此稱為線性時間非比較類排序。二 排序演算法複雜度...
資料結構 選擇排序演算法和希爾排序演算法詳解
選擇排序演算法是經典演算法之一,你可以想象你在打牌,每次拿到的一張牌就是待排序的一張,你需要每一次跟之前的牌進行比較,然後將這張牌插入到合適的位置。那麼選擇排序也是一樣,將整個陣列看成兩個部分,有序部分和無序部分。現在需要將無序部分的數字跟有序部分進行比較,插入到正確的位置 下列 是插入排序的內層迴...