排序演算法之 合併排序 歸併排序(Java實現)

2021-07-22 14:57:23 字數 1050 閱讀 7148

合併排序是一種典型的分治法演算法。先把陣列拆成兩個陣列,對兩個陣列進行繼續拆分,直到能夠對拆分後的兩個結果分別進行排序。也就是說,拆分後,使兩邊都是排好序的。顯然當拆分到兩邊只剩下乙個的時候,自然就是有序的。

拆分過後是合併,合併也是這個演算法的核心過程,其實就好比是兩副牌,這兩副牌已經是有序的,要把它們合併,只要每次都翻開最上面一張牌,然後進行對比,把小的(或此處按照遞增排序舉例)拿走。然後繼續翻牌。很顯然,這裡會用到額外的陣列空間,所以合併排序並不是原地排序。為了簡化這個過程,合併的時候,在兩副牌下面都放置乙個無窮大的哨兵牌。具體過程如下圖所示。

本圖選自演算法導論。實現**如下:

/**合併排序演算法,乙個數字的時候算已排序。最後合併排序過的陣列

* @param a

* @param p

* @param r

*/public void mergesort(int a, int p, int r)

}

合併的演算法如下:

/**合併排序過的陣列,把陣列分成了[p --> q],[q+1 --> r]

* @param a 陣列a

* @param p

* @param q

* @param r

* @return

*/public int merge(int a, int p, int q, int r)

for(int i = 0; i < n2; i++)

l[n1] = integer.max_value;

r[n2] = integer.max_value;

int i = 0, j = 0;

for(int k = p; k <= r; k++)else

}return a;

}

如果對**有疑惑可以看我的github原始碼,上面有所有方法的單元測試:

如果發現問題,請立刻告訴我。我可不想誤人子弟

歸併排序(合併排序)

題目 要求氣泡排序的交換次數,也就是求逆序數的個數。在乙個排列中如果有兩個數的排序和所規定的排序規則相反,則這兩個數是乙個逆序。乙個排列中的逆序的總數就是這個排列的逆序數。用歸併排序,求逆序數的個數。poj 2299 這道題充分印證了,即使merge本身可能用的不多,但分冶的思想卻是無所不在 inc...

歸併排序(合併排序)

合併排序 merge sort 是又一類不同的排序方法,合併的含義就是將兩個或兩個以上的有序資料序列合併成乙個新的有序資料序列,因此它又叫歸併演算法。它的基本思想就是假設陣列a有n個元素,那麼可以看成陣列a是又n個有序的子串行組成,每個子串行的長度為1,然後再兩兩合併,得到了乙個 n 2 個長度為2...

排序(2)歸併排序(遞迴 合併排序)

用到遞迴 合併,所以叫歸併。public static int data 遞迴 param temp 臨時陣列 param sindex 開始索引 param eindex 結束索引 private static void recursion int temp,int sindex,int eind...