八大排序演算法之歸併排序演算法(JAVA)

2021-08-15 22:03:11 字數 1812 閱讀 4819

歸併排序(merge sort)

歸併操作的工作原理如下:

效率為o(n log n)

第一步:申請空間,使其大小為兩個已經

排序 序列之和,該空間用來存放合併後的序列

第二步:設定兩個

指標 ,最初位置分別為兩個已經排序序列的起始位置

第三步:比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置

重複步驟3直到某一指標超出序列尾

將另一串行剩下的所有元素直接複製到合併序列尾

(1)演算法思想

歸併排序採用了分治策略(divide-and-conquer),就是將原問題分解為一些規模較小的相似子問題,然後遞迴解決這些子問題,最後合併其結果作為原問題的解。

歸併排序將待排序陣列a[1..n]

成兩個各含n/2個元素的子串行,然後對這個兩個子串行進行

遞迴

排序,最後將這兩個已排序的子串行進行

合併

,即得到最終排好序的序列。

具體排序過程如下圖所示:

排序圖:

分別從左到右比較兩個陣列中哪乙個值比較小,然後複製進新的陣列中,一直比較到兩個陣列中有某乙個先到末尾為止,最後把另乙個陣列中的剩餘元素複製進新陣列即可。

將乙個陣列一直對半分,問題的規模就減小了,再重複進行這個過程,直到元素的個數為乙個時,乙個元素就相當於是排好順序的。

由於前提是這個兩個陣列都是有序的,所以這整個過程是很快的,我們可以看出,對於一對長度為n的陣列,進行合併所需要的比較次數

最多為2 * n -1。

package com.sunmac.eightsort;

/**

複雜度:

*歸併排序(遞迴)

*/ public class mergesort ;

sortarray(a);

for (int i : a)

}//外部介面方法

public static void sortarray(inta)

//遞迴排序的方法

private static void mergesort(inta,int low,int high)

system.out.println();}}

private static void merge(int a,int low,int mid,int high) else

}// 把左邊剩餘的數移入陣列

while (i <= mid)

// 把右邊邊剩餘的數移入陣列

while (j <= high)

// 把新陣列中的數覆蓋原陣列

八大排序演算法 之 歸併排序

排序思想 如圖所示 排序趟數 如果2 n 如此例,length 9 8,趟數是4.排序原理 1,第一趟將相鄰兩個數歸併成乙個有序的小組合 2,第二趟將相鄰兩個有序小組合歸併成乙個更大的的有序組合 3,依次類推,直到將所有數歸併成乙個最大的組合 具體 實現如下 歸併排序主方法 public stati...

八大排序演算法之歸併排序

介紹到這裡只剩下歸併排序和基數排序沒有介紹過了。這兩種演算法各有各的特點,歸併排序是分治法的一種有效應用,所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。而基數排序又稱為桶排序,是唯一一種不需要元素之間相互比較就可以排好序的排序演算法。一 歸併排序 1.基本思想 這裡介紹的歸併排序是非遞迴版...

八大排序演算法之歸併排序

歸併排序的核心是,每次將兩個有序陣列組合成為乙個新的有序陣列。對於倆個有序陣列 def merge a list,b list list l a,l b len a len b res 0 for i in range l a l b index 0 i,j 0,0 while i歸併排序中,兩個有...