code:
#define maxn 100
void merge(int arr[],int l1,int r1,int l2,int r2)
{
int i=l1,j=l2,temp[maxn],index=0;
while(i<=r1&&j<=r2)
{
if(arr[i]<=arr[j])
{
temp[index++]=arr[i++];
}
else
{
temp[index++]=arr[j++];
}
}
while(i<=r1) temp[index++]=arr[i++];
while(j<=r2) temp[index++]=arr[j++];
for(i=0;i<index;i++)
{
arr[l1+i]=temp[i];
}
}
void mergesort(int arr[],int left,int right)
{
if(left<right)
{
int mid=(left+right)/2;
mergesort(arr,left,mid);
mergesort(arr,mid+1,right);
merge(arr,left,mid,mid+1,right);
}
}
上头里的几个while语句里,第一个while(i<=r1&&j<=r2)目的是为了先把一个数组全部清空放入temp[100],后面的两个while是为了把数组里剩余的数字放入temp里。
也就是说第一回就把一个数组掏空,第二回就把那个有剩余的数组再掏空,最后再把得到的数组temp再放回原数组,使得有序。
归并排序总而言之就是把两个有序的数组合并成一个有序的数组,那他又是如何从一个无序数组得到两个有序数组的呢?
这就在递归里头实现啦,递归首先把数组先不断分成多个小数组,两两一组,然后两两排序。最后递归返回形成两个有序数组,使用归并函数达成有序合并。
归并排序
最新推荐文章于 2024-08-12 19:32:44 发布