排序演算法(六) 歸併排序

2022-06-05 18:09:07 字數 1800 閱讀 6071

歸併排序(merge sort),又稱二路歸併排序,是指將乙個陣列一分為二,對每乙個子陣列遞迴排序,最後將排好的子陣列合併為乙個有序陣列的過程。歸併排序,是「分治法」應用的完美實現。

1. 歸併排序圖示

2. 歸併排序流程

通過圖示,可以發現歸併排序一共只需要兩個步驟:

3. **實現

歸併排序的**邏輯還是很容易看懂的,陣列兩分,左右遞迴,難點在於「合」這一步驟:

public abstract class basicmergesort implements sort 

private void sort(int array, int left, int right)

}protected abstract void merge(int array, int left, int mid, int right);

}

合併兩個有序陣列(長度分別為 n 和 m),可以開闢乙個長度為 m+n 的新陣列。

public final class mergesort1 extends basicmergesort  else if (startindex2 == right + 1)  else 

}system.arraycopy(newarray, 0, array, left, newarray.length);}}

4. 歸併排序的時間複雜度和空間複雜度顯而易見,遞迴的次數為 m = log2n,合併操作的時間消耗是線性的,所以時間複雜度 t(n) 如下:

空間複雜度為o(n).

5. 空間複雜度為 o(1) 的歸併排序

歸併排序中,合併的步驟可以採取直接插入排序(因為前半部分已經有序,所以直接插入排序的效率很高)。

如此一來,可以將空間複雜度由 o(n) 降低至 o(1),然而相對的時間複雜度則由 o(nlog2n) 公升至 o(n^2)。

public final class mergesort2 extends basicmergesort  else 

}if (!flag) }}

}

6. 歸併排序的效能分析及優化兩種歸併排序的演算法,分別是採取了空間換時間,及時間換空間的策略,其效能各有優劣,但是通過分析可以得出以下特點:

根據以上兩個性質,可以在歸併排序中,設定乙個閾值。

超過這個給定的閾值,則採取空間換時間的策略;反之,採用時間換空間的策略,從而提高歸併排序的效率。

public class mixedmergesort implements sort 

public void setthreshold(int threshold)

@override

public void sort(int array)

private void sort(int array, int left, int right) else }}

}

source code:

排序演算法(六) 歸併排序

對於歸併排序,與快速排序一樣,巧妙的應用了分治演算法的核心思想,它將整個序列分成若干組子串行,對這些子串行進行排序後,在一步一步進行合併有序子串行,從而使得整個序列達到有序。但針對於歸併排序,有著兩種不同的排序方式,一是通過整個序列進行著手,將這個序列進行一步一步的劃分,自頂向下進行處理,主要步驟包...

排序演算法 六 歸併排序

歸併排序的基本思想是分治法。先將無序序列分為若干個無序子串行,然後對無序子串行進行排序,最後合併有序子串行,得到完全有序的序列。這就是分解,求解,合併的過程。將待排序序列data 0,1,2 n 1 看成是n個長度為一的序列,將相鄰序列進行合併,得到n 2個長度為2的有序序列 將相鄰序列再次進行合併...

六 歸併排序

要將乙個陣列排序,可以先 遞迴的 將它分成層兩半分別排序,然後將結果歸併起來。它能保證任意長度為n的陣列排序所需時間和nlogn成正比 它的缺點則是它所需的額外空間和n成正比。實現歸併的一種直截了當的辦法是將兩個不同的有序陣列歸併到第三個陣列中,兩個陣列中的元素應該都實現了comparable藉口。...