mergesort归并排序
这里应用双指针算法
总体思路是不断分割数串,直到小到两个数,再利用递归合并成数串
关键思路是如何把两个排好序得数组合并成大的有序数组
1.对于两串排好序的数列,我们分别在数串两边添加一个指针,如果数串1的值小于数串2,把该值放入一个空数组temp中,数串1指针+1,反之数串2放入空数组,直到某一边到边界停下,这意味着没到边界的数串后面的每一个数都比停下的数串最大的数更大,直接把没到边界的数串后面的数放到temp后面。由此,能把两个排好序的数串整成一个排好序的大数串temp
2.两个数能通过 1 排好,如果只有一个数,不做处理,作为基情况。
3.递归
代码实现
int temp[MAXN];
void merge_sort(int q[],int left,int right){
if(left==right)return ;
int mid=(left+right)/2;
merge_sort(q,left,mid);
merge_sort(q,mid+1,right);
int i=left,j=mid+1,k=0;
while(i<=mid&&j<=right){
if(q[i]<=q[j])
temp[k++]=q[i++];
else
temp[k++]=q[j++];
}//这时可能只有一边完成 需要补刀
while(i<=mid)temp[k++]=q[i++];
while(j<=right)temp[k++]=q[j++];
for(int i=left,j=0;i<=right;i++,j++)q[i]=temp[j];
}

浙公网安备 33010602011771号