归并排序
今天的瑞士轮然后看到了标签上的归并排序根本没学过好吧于是就学习了一下
归并分为两个步揍
1.利用递归分治出两个长度为一的理论上有序数列
将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。
void mergesort(int a[], int l, int r, int ans[])
{
if (l < r)
{
int mid = (l + r) / 2;
mergesort(a, l, mid, ans); //左边有序
mergesort(a, mid + 1, r, ans); //右边有序
mergearray(a, l, mid, r, ans); //再将二个有序数列合并
}
}
2.将二个有序数列合并
这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。
//将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergearray(int a[], int first, int mid, int last, int ans[])
{
int i=l,j=mid+1,k=l,n=mid,m=r;
while(i<=n&&j<=m){
if(a[i]<=a[j]){
ans[k++]=a[i++];
}else{
ans[k++]=a[j++];
}
}
while(i<=n){
ans[k++]=a[i++];
}
while(j<=m){
ans[k++]=a[j++];
}
for(int i=l;i<=r;i++){
a[i]=ans[i];
}
}