歸併排序是建立在歸併操作上的一種有效的排序演算法,是採用分治法(divide and conquer)的乙個非常典型的應用。
後面的擴充套件題目,小和問題和逆序對個數問題,用文字真是解釋的稀爛,自己都看不下去。。。還是再紙上畫一畫,debug看一下**執行的流程會比較好。
演算法**如下:
public
class mergesort ;
mergesort(array, 0, array.length-1);
system.out.println(arrays.tostring(array));
return;
}private static void mergesort(int array, int
left, int
right)
private static void merge(int array, int
left, int
mid, int
right)
while(l1 <= mid)
while(l2 <= right)
for(int i = 0; i < helper.length; i++)}}
mergesort(int array, int left, int right)方法中主要關注三個部分:
mergesort(array, left, mid);//左半部分歸併排序
mergesort(array, mid+1, right);//右半部分歸併排序
merge(array, left, mid, right);//左右兩邊進行合併
這也就是歸併排序主要的思路。
在master公式中,a是子問題的個數,n/b是子問題的規模,o(n^d)是其他的開銷時間。
在歸併排序中,子問題的個數是2,子問題的規模是n/2,至於其他的開銷,在歸併排序中就是左右兩邊進行合併的開銷,時間複雜度為o(n)。所以,t(n) = 2*t(n/2) + o(n),也就是時間複雜度為o(n * logn)。
[3, 1, 4, 5, 2]
3左邊比3小的數:
1左邊比1小的數:
4左邊比4小的數:3, 1
5左邊比5小的數:3, 1, 4
2左邊比2小的數:1
把這些數求和得到的就是小和: 13
public
class mergesorttosmallsum ;
system.out.println(mergesort(array, 0, array.length-1));
return;
}private static int mergesort(int array, int
left, int
right)
private static int merge(int array, int
left, int
mid, int
right)
while(l1 <= mid)
while(l2 <= right)
for(int i = 0; i < helper.length; i++)
return result;}}
[4, 3, 5, 2, 1]
4右邊比4小的數:3, 2, 1
3右邊比3小的數:2, 1
5右邊比5小的數:2, 1
2右邊比2小的數:1
1右邊比1小的數:
總共8對逆序對
小和問題中,我們還是按照從小到大對陣列進行排序,因為小和問題是要找到乙個數左邊比自己小的數,所以在merge方法中,我們判斷左邊數比右邊數小的時候,那麼這個數比右邊數及其之後的數都要小,所以可以使用公式:
result += array[l1] < array[l2] ? (right-l2+1) * array[l1] : 0;
但是在逆序對問題中,是找左邊比右邊數大的,顯然使用從大到小排序更適合處理這個問題。判斷出左邊數比右邊數大的時候,那麼可以肯定左邊這個數,比右邊數及其後邊的數都要大。
public
class mergesorttoinversion ;
system.out.println(mergesort(array, 0, array.length-1));
system.out.println(arrays.tostring(array));
return;
}private static int mergesort(int array, int
left, int
right)
private static int merge(int array, int
left, int
mid, int
right)
while(l1 <= mid)
while(l2 <= right)
for(int i = 0; i < helper.length; i++)
return result;}}
歸併排序及其分析
歸併排序演算法實現 private static void mergesort anytype a,anytype tmparray,int left,int right if leftint center left right 2 mergesort a,tmparray,left,center ...
歸併排序及其應用
歸併排序採用分治和遞迴的思想完成排序,簡單來說就是,將乙個規模較大的排序問題轉換成兩個較小規模的問題,最終形成兩個已經排好的序的子陣列,進而進行歸併即可。public class mergesort 左右兩邊排序,確定終中點 int mid left right left 1 mergesort a...
歸併排序MergeSort及其變形
歸併排序其實 很容易理解,在我們將陣列中的元素從小到大排序的過程中,順便解決了乙個附加問題,即陣列中的逆序對有多少個 即對於陣列下標i,j,如果滿足i j 且 a i a j 則稱 i,j 為乙個逆序對 其實我們在排序的過程中,可以解決的不僅是逆序對的問題,由逆序對衍生的一系列問題 即對於陣列下標i...