归并排序的本质思想是:分治
样例:将5个数利用归并排序法进行排序
输入样例:
5 3 1 2 4 5
归并与快排不同。归并排序是先递归拆分后排序,而快排是排序后递归。
函数传参与快排相同。
主函数部分:
int main()
{
int n;
scanf("%d",&n);
//输入数据个数
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
//输入数据
merge_sort(a,0,n-1);
//传参
for(int i=0;i<n;i++)
printf("%d",a[i]);
//排完序后输出数组内容
return 0;
}
图中数字代表下标。
归并代码部分:(图中22行,24行循环条件有问题,改成while(q<=mid)和while(e<=r)才对)
正确的归并函数代码:
全体代码:
#include <iostream>
using namespace std;
const int N=1e6+10;
int a[N],tmp[N];
void merge_sort(int a[],int l,int r)
{
if(l==r) return;
int mid=l+r>>1,q=l,e=mid+1;
merge_sort(a,l,mid),merge_sort(a,mid+1,r);
int k=0;
while(q<=mid&&e<=r)
if(a[q]<=a[e]) tmp[k++]=a[q++];
else tmp[k++]=a[e++];
while(q<=mid) tmp[k++]=a[q++];
while(e<=r) tmp[k++]=a[e++];
for(int i=l,j=0;i<=r;i++,j++) a[i]=tmp[j];
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
merge_sort(a,0,n-1);
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}