歸併排序是用分治思想,分治模式在每一層遞迴上有三個步驟:
分解(divide):將n個元素分成個含n/2個元素的子串行。
解決(conquer):用合併排序法對兩個子串行遞迴的排序。
合併(combine):合併兩個已排序的子串行已得到排序結果。
歸併排序時間複雜度o(nlogn),每次歸併處理n個,歸併logn次。
歸併排序空間複雜度o(n),其實是長度n的臨時陣列和logn的壓入棧的資料,預設就是o(n)了。
排序動畫參考
用遞迴實現:
private
void
mergesort
(int
arr,
int[
] temparr,
int start,
int end)
}void
mergesort
(int
arr,
int len)
用迭代實現:
思路:第一層for迴圈控制步長,第二層迴圈對每個排序單元進行排序。
為了方便理解,舉乙個例子:
假設有乙個長度為10的陣列要處理
for
(int seg =
1; seg < len; seg +
= seg)
}
實現
private
void
mergesort
(int
arr,
int len)
// 將排好序的陣列替換到原陣列上,繼續迴圈
int[
] temp = arr;
arr = temparr;
temparr = temp;}}
void
mergesort
(int
arr,
int len)
C語言兩種方法實現歸併排序
遞迴實現歸併排序思想 使用遞迴的方法來分元素 使用臨時陣列來儲存排好序的元素 把臨時陣列中的元素拷貝給原陣列 void mergeadd int arr,int left,int mid,int right,int temp else while i mid while j right 把temp中...
排序的兩種方法
如果adt需要比較大小,或者要放入collections或arrays進行排序,可實現comparator介面並override compare 函式。第一種 構建乙個新的comparator類,重寫compare 函式,在客戶端直接呼叫靜態函式collections.sort 新的comparat...
排序演算法 歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另...