归并排序
#include<iostream>
#include<cstdio>
using namespace std;
void Merge(int a[],int l,int mid,int r);
void MergeSort(int a[],int l,int r)
{
if(l==r)
return ;
int mid=l+((r-l)>>1);
MergeSort(a,l,mid);
MergeSort(a,mid+1,r);
Merge(a,l,mid,r);
}
void Merge(int a[],int l,int mid,int r)
{
int i=0;
int p1=l,p2=mid+1;
int help[r-l+1];
while(p1<=mid&&p2<=r)
help[i++]=(a[p1]<a[p2])?a[p1++]:a[p2++];
while(p1<=mid)
help[i++]=a[p1++];
while(p2<=r)
help[i++]=a[p2++];
for(int i=0;i<r-l+1;i++)
a[l+i]=help[i];
}
int main()
{
int a[100];
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>a[i];
MergeSort(a,0,n-1);
for(int i=0;i<n;i++)
cout<<a[i]<<' ';
cout<<endl;
}
return 0;
}
小和问题
#include<iostream>
#include<cstdio>
using namespace std;
int Merge(int a[],int l,int mid,int r)
{
int i=0;
int help[r-l+1];
int p1=l,p2=mid+1;
int ans=0;
while(p1<=mid&&p2<=r)
{
ans+=(a[p1]<a[p2])?(r-p2+1)*a[p1]:0;
help[i++]=(a[p1]<a[p2])?a[p1++]:a[p2++];
}
while(p1<=mid)
help[i++]=a[p1++];
while(p2<=r)
help[i++]=a[p2++];
for(int i=0;i<r-l+1;i++)
a[l+i]=help[i];
return ans;
}
int MergeSort(int a[],int l,int r)
{
if(l==r)
return 0;
int mid=l+((r-l)>>1);
return MergeSort(a,l,mid)+MergeSort(a,mid+1,r)+Merge(a,l,mid,r);
}
int main()
{
int a[100];
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>a[i];
int ans=MergeSort(a,0,n-1);
cout<<ans<<endl;
}
return 0;
}
#include<iostream>
#include<cstdio>
using namespace std;
void Merge(int a[],int L,int Mid,int R)
{
int index=0;
int help[R-L+1];
int p1=L,p2=Mid+1;
while(p1<=Mid&&p2<=R)
{
if(a[p1]<a[p2])
for(int i=p2;i<=R;i++)
printf("(%d,%d)\n",a[p1],a[i]);
help[index++]=(a[p1]<a[p2])?a[p1++]:a[p2++];
}
while(p1<=Mid)
help[index++]=a[p1++];
while(p2<=R)
help[index++]=a[p2++];
for(int i=0;i<R-L+1;i++)
a[L+i]=help[i];
}
void MergeSort(int a[],int L,int R)
{
if(L>=R)
return;
int mid=L+((R-L)>>1);
MergeSort(a,L,mid);
MergeSort(a,mid+1,R);
Merge(a,L,mid,R);
}
int main()
{
int a[100];
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>a[i];
MergeSort(a,0,n-1);
}
return 0;
}