题解 P1177 【【模板】快速排序】
似乎没什么人写归并。。。
补一发
int n,a[10000010],L_x[10000010],R_x[10000010];
int mergesort_Wzz(int a_x[],int l_x,int mid_x,int r_x)
{
int n1_x,n2_x;
n1_x=mid_x-l_x+1;//个数左&个数右
n2_x=r_x-mid_x;
for(int i=1;i<=n1_x;i++)
{
L_x[i]=a_x[i+l_x-1];
}
for(int i=1;i<=n2_x;i++)
{
R_x[i]=a_x[i+mid_x];
}
L_x[n1_x+1]=999999999;//很重要,因为可以避免爆一边的情况
R_x[n2_x+1]=999999999;
int q1_x=1,q2_x=1;
for(int i=l_x;i<=r_x;i++)//合并两边
{
if(L_x[q1_x]<R_x[q2_x])
{
a_x[i]=L_x[q1_x];
q1_x++;
}
else
{
a_x[i]=R_x[q2_x];
q2_x++;
}
}
return 0;
}
int merge_Wzz(int a_x[],int l_x,int r_x)
{
if(l_x<r_x)
{
int mid_x=(l_x+r_x)/2;//分治,走左走完走右边,最后合并
merge_Wzz(a_x,l_x,mid_x);//隐含递归边界
merge_Wzz(a_x,mid_x+1,r_x);
mergesort_Wzz(a_x,l_x,mid_x,r_x);
}
return 0;
}
这个是归并函数(注意注释)
上代码
#include<bits/stdc++.h>
using namespace std;
int n,a[10000010],L_x[10000010],R_x[10000010];
int mergesort_Wzz(int a_x[],int l_x,int mid_x,int r_x)
{
int n1_x,n2_x;
n1_x=mid_x-l_x+1;
n2_x=r_x-mid_x;
for(int i=1;i<=n1_x;i++)
{
L_x[i]=a_x[i+l_x-1];
}
for(int i=1;i<=n2_x;i++)
{
R_x[i]=a_x[i+mid_x];
}
L_x[n1_x+1]=999999999;
R_x[n2_x+1]=999999999;
int q1_x=1,q2_x=1;
for(int i=l_x;i<=r_x;i++)
{
if(L_x[q1_x]<R_x[q2_x])
{
a_x[i]=L_x[q1_x];
q1_x++;
}
else
{
a_x[i]=R_x[q2_x];
q2_x++;
}
}
return 0;
}
int merge_Wzz(int a_x[],int l_x,int r_x)
{
if(l_x<r_x)
{
int mid_x=(l_x+r_x)/2;
merge_Wzz(a_x,l_x,mid_x);
merge_Wzz(a_x,mid_x+1,r_x);
mergesort_Wzz(a_x,l_x,mid_x,r_x);
}
return 0;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
merge_Wzz(a,1,n);
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
}
题解虽好,注意shi名