归并排序讲解http://t.csdn.cn/Er5T4这个讲解的挺好的,可作为备用基础知识。
接下来附上题目要求
附上代码
//hhhh终于搞懂了 这里是不能用暴力的 暴力的话 n2会超时(应该把)然后我们用归并 为什么用归并呢,因为归并调换的次数就是逆序对的数量呀
//这里首先要搞懂归并的过程的代码,那你看 我们的代码是先分成两个然后进行对比排序 那res=左边所有+右边所有+(左右);
//废话不多说 showcode
#include <iostream>
using namespace std;
typedef long long LL;
const int N=100000;
LL res=0;
int q[N],tmp[N];
LL merge_sort(int q[],int l,int r)
{
if(l>=r)
return 0;
int mid=(l+r)/2;
res= merge_sort(q,l,mid)+merge_sort(q,mid+1,r);
int i=l;
int j=mid+1;
int k=0;
while(i<=mid&&j<=r)
{
if(q[i]<=q[j])//这个等号没有加 一定要灵活运用呀
tmp[k++]=q[i++];
else
{
tmp[k++]=q[j++];
res+=mid-i+1;
}
}
//扫尾
while(i<=mid)
tmp[k++]=q[i++];
while(j<=r)
tmp[k++]=q[j++];
//赋值加不加无所谓了吧 没加结果是2 我加上试试、加上还是有用的
for(int i=l,j=0;i<=r;j++,i++)//这里记得有等号 因为现在是两个小区间的大区间呀
q[i]=tmp[j];
return res;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>q[i];
}
// int x=merge_sort(q,0,n-1);这里我之前写错了 没有用大数 这不是乱转么
cout<<merge_sort(q,0,n-1);
}
好了,那我们在遇到什么题的时候会用到归并排序呢?