归并排序

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再放回原数组,使得有序。
归并排序总而言之就是把两个有序的数组合并成一个有序的数组,那他又是如何从一个无序数组得到两个有序数组的呢?
这就在递归里头实现啦,递归首先把数组先不断分成多个小数组,两两一组,然后两两排序。最后递归返回形成两个有序数组,使用归并函数达成有序合并。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值