一、各種演算法比較序號
排序類別
時間複雜度
空間複雜度穩定1
插入排序
o(n2)1√
2希爾排序
o(n2)1×
3氣泡排序
o(n2)1√
4選擇排序
o(n2)1×
5快速排序
o(nlogn)
o(logn)×6
堆排序o(nlogn)1×
7歸併排序
o(nlogn)
o(n)√
1氣泡排序(bubble sort)
每次大的下沉小的上浮,相鄰兩兩比較
如 3 2 1 6 5
一輪後:2 1 3 5 6
二輪後:1 2 3 5 6
2選擇排序(selection sort)
n-1次操作
每次選出最值與第乙個元素交換
有陣列aaa[5]=
進行第一次交換後為 1與1000換
進行第二次交換後為 10與100換
進行第三次交換後為 100與1000換
進行第四次交換後為 1000與10000換
3插入排序(insertion sort)
每次增加乙個元素排好序
5 | 1 7 3 1 6
1 5 | 7 3 1 6
1 5 7 | 3 1 6
1 3 5 7 | 1 6
1 1 3 5 7 | 6
1 1 3 5 6 7 |
4堆排序
(1) 初始化二叉樹
(2) 把最上面的元素與最後乙個交換(定下最後乙個的位置)
原則上面大於下面,用最值交換
(3) 調整重複(2)直至最後
交換次數不包括初始化二叉樹
18,30,35,10,46,38,5,40進行堆排序(假設堆的根節點為最小關鍵碼),在初始建
堆過程中需進行的關鍵碼交換次數是(7)
第一次 30 18 35 10 46 38 5 40
第二次 35 30 18 10 46 38 5 40
第三次 35 30 18 10 46 38 5 40
第四次 46 35 30 18 10 38 5 40
第五次 46 38 35 30 18 10 5 40
第六次 46 38 35 30 18 10 5 40
第七次 46 40 38 35 30 18 10 5 40
5歸併排序
核心:分組排序再合併逐漸到乙個組
{9,38,65,36,76,13,27,49,11,4}
先把序列分成5組,並組內排序:,,,,
再將組分成3大組:,,
然後分成2大組:,
最後:
6快速排序
(1) 確定乙個key(一般設第乙個數)
(2) 從後往前再從前往後搜尋(以此迴圈,若小於key則交換)
(3) 最後變成key的左邊小於key右邊大於key
(4) 再將key左右的陣列重複(1)(2)(3)
以下上下對應
|a[0]、 |a[1]、a[2]、 a[3]、a[4]、a[5]、a[6]、a[7]:
24 19 32 43 38 6 13 22
初始關鍵資料key=a[0]=24,第一輪排序中一直不變
第一次從後往前搜,a[0]>a[7],變換,24 22對換,a[0]=22,a[7]=24,key=a[7]=24 結果: 22 19 32 43 38 6 13 24
第二次從前往後搜,a[1]小於a[7],不變換。a[2]>a[7],變換,32
24對換,a[2]=24,a[7]=32,key=a[2]=24 結果:
22 19 24 43 38 6 13 32
第三次從後往前搜,a[2]>a[6],變換,24 13對換,a[2]=13,a[6]=24,key=a[6]=24 結果:
22 19 13 43 38 6 24 32
第四次從前往後搜,a[3]>a[6],變換,43 24對換,a[3]=24,a[6]=43,key=a[3]=24 結果:
22 19 13 24 38 6 43 32
第五次從後往前搜,a[3]>a[5],變換,24 6對換,a[3]=6,a[5]=24,key=a[5]=24 結果:
22 19 13 6 38 24 43 32
第六次從後往前搜,a[4]>a[5],變換,38 24對換,a[4]=24,a[5]=38,key=a[4]=24 結果:
22 19 13 6 24 38 43 32
即最終排序結果為: 22 19 13 6 24 38 43 32 之後對24兩邊的子集分別按以上方法排序 24
7希爾排序
(1) 確定d(距離),把陣列每隔d分組
(2) 組內排序
(3) d減小重複(1)(2)直至d=1
比如,1 5 3 7 18 6 2 9 4
d是3,則分組為
1 5 3 2 9 4 7 18 6
d是2,則分組為
1 2 3 4 6 5 7 18 9
d是1,則
1 2 3 4 5 6 7 9 18
掌握了思想其他方法類似,望大家嘗試自己程式設計嘗試不同方法(大小端、從大到小從小到大排序)
各大排序演算法
後面慢慢完善 includeint h 101 用來存放堆的陣列 int n 用來儲存堆中元素的個數,也就是堆的大小 交換函式,用來交換堆中的兩個元素的值 void swap int x,int y 向下調整函式 傳入乙個需要向下調整的結點編號i,這裡傳入1,即從堆的頂點開始向下調整 void si...
各大排序演算法自己總結
1.歸併排序 把十個數進行從小到大排序 每一次都把陣列分成兩部分,然後進行排序,然後把兩部分排好序再合併到一起,一次進行下去直到只剩下乙個元素,結束。時間複雜度為o n logn 快速排序也是分治演算法的經典例子。下面 和注釋自己純手敲的.include includeusing namespace...
回顧Java各大排序演算法(持續更新)
馬上大四了,面試前複習下基本的排序演算法,然後寫出來整理下。氣泡排序 param array 待排序的陣列 public static void bubblesort int array 選擇排序 param arr 待排序的陣列 public static void selectionsort i...