演算法篇之歸併排序

2021-08-04 15:15:46 字數 1455 閱讀 8432

**歸併排序是建立在歸併操作上採用分治法的一種排序演算法。**
將2個有序數列進行歸併操作。比較2數列第乙個數的大小,取小的放入合併數列並刪除該數,直至乙個數列為空,則將另一數列一次新增至合併數列。
memeryarray(int a, int b,int c) 

while (i < a.length)

c[k++] = c[i++];

while (j < b.length)

c[k++] = c[j++];

}

歸併數列的時間複雜度為o(n)。

對陣列歸併排序思路:遞迴的 每次將陣列分為2組 直至各組為1個元素時,這些陣列有序,然後再合併陣列。

5434762362

54347 62362

54 347 62 362

5 4 3 47 6 2 3 62

5 4 3 4 7 6 2 3 6 2

5 4 3 47 6 2 3 26

45 347 26 236

34457 22366

223344567

上面是乙個陣列進行歸併排序得分解步驟。

實現**

呼叫:***是排序得陣列,tmp為中間陣列

mergesort(***, 0, ***.length-1,tmp);

static

void memeryarray(int a, int first, int mid, int last, int tmp)

while (i <= m)

tmp[k++] = a[i++];

while ( j <= n)

tmp[k++] = a[j++];

/*** 複製歸併陣列

*/for (i = 0; i < k; i++)

}static

void mergesort(int a, int first, int last, int b)

}

測試:建立隨機數陣列,排序成功。

效率:陣列個數         時間(ms)

10 1 0 1

100 0 0 1

1000 8 2 1

10000 3 20 3

100000 21 25 24

可以看

出,隨著陣列的增大,排序時間增加不大。定義時間複雜度n*logn。

常用排序演算法遞迴篇之歸併排序

合併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法的乙個非常典型的應用。合併排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行...

演算法之歸併排序

歸併排序 void mergearray int a,int temp,int left,int mid,int right else while i1 mid while i2 right for int i 0 i k i 上面 為合併a left,mid 和a mid 1,right 的 因為...

演算法之歸併排序

歸併排序是分治法 divide and conquer 的經典案例。分治模式在每一層遞迴上都有三個步驟 分解 divide 將原問題分解成一系列子問題 解決 conquer 遞迴地解各子問題。若子問題足夠小,則直接求解 合併 combine 將子問題的結果合併成原問題的解。歸併排序 merge so...