mergeSort(A,p,q,r),其中A是一个数组,p,q,r是数组的下标,满足p<=q<=r。该过程假设A[p..q]和A[q+1..r]是已排好序,该函数合并这两个子数组形成单一的已排好序的子数组并代替当前的子数组A[p..r]。
该归并过程可以用扑克牌游戏描述。桌上有两堆牌,每堆都已排序,最小的牌在顶上。我们希望将两堆牌合并成单一的排好序的输出堆。基本步骤包括在牌面朝上的两堆牌的顶上两张牌中选取较小的一张,将该牌从其堆中移开。重复这个步骤。
思路:新建两个数组,将A[p..q]和A[q+1..r]分别复制到里面去,然后再从开头进行比较,将最小的放到数组A中去。
void mergeSort(vector<int> &nums,int p,int q,int r){
vector<int> l1,l2;
int a=0,b=0;
for(int i=p;i<=q;i++)
l1.push_back(nums[i]);
for(int i=q+1;i<=r;i++)
l2.push_back(nums[i]);
for(int k=p;k<=r;k++){
if(l1[a]<=l2[b])
{
nums[k]=l1[a];
a++;
}
else
{
nums[k]=l2[b];
b++;
}
k++;
}
}