思路:
将序列对半分为两个子序列,两个子系列排好序后,再合并为一个序列,且合并后依然有序。
对于子序列,也可以再分为两个更小的子序列,重复上述过程。
很明显是一个递归的过程,将序列不断平分,直到不可再分。
那么含有n个元素的序列最后便会被分为n个子序列,然后子序列进行两两有序归并,再对归并后的n/2个有序子序列再进行有序归并,如此重复,直到所有子序列归并为一个序列。
代码:
//有序归并:用于把左右两个排序好的子序列合并起来
void Merge(vector<int> &v,int beg,int end,int mid)
{
//将序列t[beg,mid]与t[mid+1,end]有序地归并入序列v
vector<int> t(v);//复制出一个数组t,方便操作
int i=beg,j=mid+1,k=beg;//分别是三个序列的伪指针,初始指向各自的首元素
while(i<=mid && j<=end)
{
//对比两个数组的元素,将较小的元素放到数组v中
if(t[i]<=t[j])
{
v[k]=t[i];
++i;
}
else
{
v[k]=t[j];
++j;
}
++k;
}
//将某个数组中剩余的元素都搬运至数组v中
while(i<=mid)
{
v[k]=t[i];
i++;
k++;
}
while(j<=end)
{
v[k]=t[j];
j++;
k++;
}
}
//归并排序
void MergeSort(vector<int> &v,int beg,int end)
{
if(beg<end)
{
int mid=(beg+end)/2;//求中位下标
MergeSort(v,beg,mid);//对左边的子序列进行归并排序
MergeSort(v,mid+1,end);//对右边的子序列进行归并排序
Merge(v,beg,end,mid);//归并左右两个子序列
}
}