归并排序(Merging Sort)。“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。时间复杂度为O(nlog2n)。
2路归并排序每次将两个有序子序列进行合并。
//将source顺序表中的两个子序列source[i...m],source[m+1..n]进行合并,合并结果保存在dest[i..n]中
template<typename T>
void merge(vector<T>& source,vector<T>& dest,int i,int m,int n)
{
for (int j = m+1,k = i;i <= m && j <= n;k++)
{
if (source[i] < source[j])
dest[k] = source[i++];
else
dest[k] = source[j++]
}
if (i <= m)
while(i <= m)
dest[k++] = source[i++];
if(j <= n)
while (j <= n)
dest[k++] = source[j++];
}
template <typename T>
void mergesort(vector<T>& source,vector<T>& dest,int s,int t)
{
if (s == t)
dest[s] = source[s];
else
{
int m = (s + t)/2;
mergesort(source,dest,s,m);
mergesort(source,dest,m+1,t);
}
}