各大排序演算法比較

2021-08-04 07:37:31 字數 2787 閱讀 7720

一、各種演算法比較序號

排序類別

時間複雜度

空間複雜度穩定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...