是一高等排序演算法,External sort常用的方法之一。
基本概念:與quick sort相類似,皆利用Divide and conquer algorithms來解決問題。就是把一複雜問題拆解成兩個
或更多的相同或相似的子問題,直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。
主要是將原數列拆解成許多小數列,再將已排序的數列做合併。
Time complexity:
Best.Worst.Average case皆為O(n log n)。
因n筆records須要作log n回合才完成,而每一回合花O(n)time去合併各runs => O(n log n)。
T(n)=T(n/2)+T(n/2)+c*n
=2T(n/2)+c*n => O(n log n)
Space complexity:
O(n)。
額外空間需求來自於暫存每一回合之合併結果之所須空間,等同於input data space。
Stable。
ex: Input:[5,8][5*,10]
Output:[5,5*,8,10]
MergeSort(void) //Iterative版本
//Run:排序好的片段資料。
//Run長度:Run中之記錄個數。
{while (Run1 and Run2 尚未scan完) do
{ if p<=q then
{ 輸出p格之值到new run;
p前進一格;
}
else
{輸出q格之值到new run;
q前進一格;
}
}
while(Run1 尚未scan完)
{ copy Run1剩下Data to new run;
}
while(Run2 尚未scan完)
{ copy Run2剩下Data to new run;
}
}
rMergeSort(x:afile,l,u,p:integer) //Recursive版本
//sort x[l]~x[u]成一個Run p
{if l>=u then p=l;
else
{ mid=(l+u)/2;
rMergeSort(x,l,mid,q);
rMergeSort(x,mid+1,u,r);
rMergeSort(x,q,r,p);
}
}