歸併排序(MERGE-SORT)是利用歸併的思想實現的排序方法,該算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題而後遞歸求解,而治(conquer)的階段則將分的階段獲得的各答案"修補"在一塊兒,即分而治之)。html
/**
* 歸併排序
* 簡介:將兩個(或兩個以上)有序表合併成一個新的有序表 即把待排序序列分爲若干個子序列,每一個子序列是有序的。而後再把有序子序列合併爲總體有序序列
* 時間複雜度爲O(nlogn)
* 穩定排序方式
* @param a 待排序數組
*/
private void mergeSort(int[] a, int low, int high){
if(low < high){
int mid = (low + high) >>> 1;
mergeSort(a, low, mid);
mergeSort(a,mid+1, high);
merge(a, low, mid, high);
}
}
/**
* 將數組中low到high位置的數進行排序
* @param a 待排序數組
* @param low 待排的開始位置
* @param mid 待排中間位置
* @param high 待排結束位置
*/
private void merge(int[] a, int low, int mid, int high){
int[] temp = new int[high -low + 1];
int i = low; // 左指針
int j = mid + 1; // 右指針
int k = 0;
// 將較小的數移到新數組中
while (i <= mid && j <= high){
if(a[i] < a[j]){
temp[k++] = a[i++];
} else {
temp[k++] = a[j++];
}
}
// 把左邊剩餘的移到數組中
while (i <= mid){
temp[k++] = a[i++];
}
// 把右邊剩餘的移到數組中
while (j <= high){
temp[k++] = a[j++];
}
// 把新數組中的數覆蓋原數組
for(int k2 = 0; k2 <temp.length; k2++){
a[k2+low] = temp[k2];
}
}
@Test
public void mergeTest(){
int[] a={7,5,3,2,9,10,8,4,6,1};
mergeSort(a, 0, a.length-1);
System.out.println(Arrays.toString(a));
}
複製代碼
參考:
必須知道的八大種排序算法【java實現】(二) 選擇排序,插入排序,希爾算法【詳解】
圖解排序算法(四)之歸併排序java