歸併排序及其擴充套件問題

2021-08-19 20:40:15 字數 2695 閱讀 8952

歸併排序是建立在歸併操作上的一種有效的排序演算法,是採用分治法(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...