歸併排序採用分治的方法,將陣列對半地拆分成子陣列,最後再有序地合併子陣列(merge:雙指標法,比較指標元素的大小來有序合併)。
時間複雜度分析:
設陣列長為n,將陣列分成小陣列一共要logn步,每步都是乙個合併有序陣列的過程,時間複雜度記為o(n),故一共為o(nlogn)。歸併排序的效能不受初始資料的影響,不管初始資料如何,歸併排序的時間複雜度都是o(nlogn)。
空間複雜度:
需要申請與目標陣列等長的臨時陣列,空間複雜度o(n)。
穩定性:
如果相同值,但不在同一子陣列,有序合併的時候會按照原有的前後順序合併給臨時陣列,所以合併之後,相同值元素的前後順序不變。
應用:歸併排序的比較次數小於快速排序的比較次數,移動次數一般多於快速排序的移動次數。一般用於對總體無序,但是各子陣列相對有序的陣列
**如下:
public class main ;
system.out.print("排序前:");
arrprint(arr);
mergesort(arr);
system.out.print("排序後:");
arrprint(arr);
}// 歸併排序
// 初始化臨時陣列temp,用於儲存合併好的陣列。呼叫歸併排序遞迴函式mergesort,
// 左指標初始化為頭索引0,右指標初始化為尾索引arr.length-1。
private static void mergesort(int arr)
// 歸併排序的遞迴函式
// 輸入為:待排序陣列arr,左指標left,右指標right,臨時陣列temp。
//// 遞迴函式終止條件為當左指標left >= 右指標right(即當無法再對半切分陣列時),
// 將取左右索引的中間位置mid=(left + right)/2,用於對半切分陣列為左右子陣列。
// 之後mid將作為歸併排序左子陣列的終點,mid+1作為歸併排序右子陣列的起點。
// 遞迴呼叫mergesort,對左半邊陣列歸併排序,得到有序左陣列。
// 遞迴呼叫mergesort,對右半邊陣列歸併排序,得到有序右陣列。
// 合併函式merge,在遞迴回來之後,合併兩個有序的左右陣列。
private static void mergesort(int arr, int left, int right, int temp)
}// 合併函式
// 合併兩個有序子陣列,定義l=left為左陣列指標,r=mid+1為右陣列指標。
// 第乙個while,雙指標在左右陣列遍歷的元素將進行比對,將小的那個存入temp,
// 存入之後temp指標t右移,存入元素的左右陣列指標l/r右移。
// 待左陣列(右陣列)存完了,右陣列(左陣列)陣列執行第三個(第二個)while,
// 將剩餘元素存入temp。
// 最後乙個while將temp中所有元素複製入arr。
private static void merge(int arr, int left, int mid, int right, int temp)
while (l <= mid)
while (r <= right)
t = 0;
while (left <= right)
}// 輔助函式:將int 列印出來
private static void arrprint(int arr)
str.delete(str.length() - 2, str.length());
system.out.println(str.tostring());}}
輸出
排序前:[3, 3, 5, 6, 2, 1, 9, 7]
排序後:[1, 2, 3, 3, 5, 6, 7, 9]
例項的動畫演示如下:
歸併排序(省略merge):
merge函式:
經典演算法 歸併排序
題目說明 歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法也是採用分治法 divide and conquer 的乙個非常典型的應用。演算法複雜度為o n logn 題目解析 歸併排序是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半...
排序演算法 5 歸併排序
歸併排序演算法思路 先將陣列不斷均分成兩堆,直至只有乙個元素,再兩兩進行排序合併。使用了大量了額外陣列空間,但減少了比較次數和寫操作。時間複雜度與空間複雜度將再排序演算法總結裡面討論。下面直接展示演算法 def merge sort nums nums為list型別 分解陣列直至陣列長度小於1 wh...
經典排序演算法之 歸併排序
1 思想 多次將兩個或兩個以上的有序表合併成乙個新的有序表。2 演算法時間複雜度 最好的情況下 一趟歸併需要n次,總共需要logn次,因此為o n logn 最壞的情況下,接近於平均情況下,為o n logn 說明 對長度為n的檔案,需進行logn 趟二路歸併,每趟歸併的時間為o n 故其時間複雜度...