歸併排序(一)

2021-08-22 08:11:59 字數 1538 閱讀 9332

上兩篇部落格介紹了選擇排序插入排序和希爾排序 這次以我的理解來介紹一下歸併排序 在百科上面看到的概念:歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

二路歸併就是把2個有序的序列歸併到一起,形成乙個有序的序列

假如 a =[ 2,4,5,6] b=[1,3,6,9,10]

歸併的過程就是先定義乙個陣列c c.length = a.length + b.length

int i,j;

i=j=0; //a,b的索引

for(int k=0;ka.length-1)

c[k]=b[j++] //當a的元素全部插入到c中是 直接按順序把b中的元素插入到c中

else if(j>b.length-1)

c[k]=a[i++] //當b的元素全部插入到c中是 直接按順序把a中的元素插入到c中

else if(a[i]歸併排序其實是對乙個陣列採用遞迴的形式來進行二路歸併(下面我們將詳細介紹),為了避免額外的開銷,我們採用原地歸併

下面我們來介紹一下原地歸併,由於每次歸併我們都要申請而外的空間,來共二個序列來歸併,我們想能不能這樣,直接定義乙個靜態陣列 每次歸併前我們把需要遞迴的元素複製到這個靜態陣列裡面

下面我們來介紹歸併排序的思路;

public static void merge(comparable a,int lo,int mid,int hi)

}

這是我們原地歸併的** 要注意hi = length-1  mid = lo + (hi-lo)/2

我們先給出歸併排序的**,供讀者思考(用遞迴的思想)

public static void sort(comparable  a,int lo,int hi)

public static void sort(comparable a)

下面給出圖供大家理解

實際上就是遞迴到長度為1時返回到上一次 將2個長度為1的歸併起來......

全**:

一 歸併排序

這幾天在學演算法,打算寫成部落格記下來加深一下印象,其中有什麼理解的不對或者寫錯的地方請點出。第乙個是歸併排序,該演算法是分治法的典型應用,完全遵循分治模式,直觀的操作如下 1.分解 分解待排序的n個元素的序列成兩個n 2的子串行。2.解決 使用歸併排序遞迴地排序兩個子串行。3.合併 合併兩個已排序...

歸併排序(2 路歸併排序)

遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...

python歸併排序 python 歸併排序

排序思路 1.將陣列分成兩組a,b,建立臨時陣列 c,c長度 a b 2.i,j分別屬於a,b 3.若a i b j 將b j 放入c,j 否則 a i 放入c,i 4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中 5.遞迴3 4直到a,b序列的長度 1 歸併排序 class merg...