运用了分治的思想:
1.划分区间,一个左区间【l,l+r>>1】,一个有区间[(l+r>>1)+1,r]
2.合并这两个有序的区间,变成一个有序的区间(用双指针算法)
模板:
void merge_sort(int q[],int l,int r)
{
if(l==r)return ;//当只有一个数的时候直接回溯
int mid=l+r>>1;//中间点
merge_sort(q,l,mid);merge_sort(q,mid+1,r);//划分区间
// 合并区间
int s=0,i=l,j=mid+1;
while(i<=mid&&j<=r)
{
if(q[i]<=q[j])t[s++]=q[i++];
else t[s++]=q[j++];
}
while(i<=mid)t[s++]=q[i++];
while(j<=r)t[s++]=q[j++];
for(int i=l;i<=r;i++)q[i]=t[i-l];//合并区间写回原数组
}