归并排序采用分治法的一个非常典型的应用。先将需要拍列的数列分开来读将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并;
也就是说:先递归将数组分开输入:
黈力大法好!
合并操作(强迫症直接f12去掉中间文字)
开起来就是:二分+递归
没错就是这样,也就是在递归函数中设下一层为二分后的数组直到递推到每一个集合只有一个数后才开始输入,处理,返回(归)
一个板子:
#include <iostream> #include <cstdio> #include <cctype> //判断一个字符是否为'0'~'9' using namespace std; int a[100001],sta[100001]; int ans=0; //原序列和辅助空间 //归并排序 void mergesort(int l,int r) { if (l==r)//一个元素必定有序 { scanf("%d",&a[l]);//直接输入qwq return; } int mid=(l+r)>>1,p1=l,p2=mid+1,p3=1; mergesort(l,mid); mergesort(mid+1,r); //先分别把两个序列排列有序 while (p1<=mid&&p2<=r)//开始合并左右两个序列 { if (a[p1]<=a[p2])sta[p3++]=a[p1++];//选两个序列前面两个数中最小的数字放进去 else sta[p3++]=a[p2++],ans+=...;//这个 自己会推吗自己写着玩吧 } while (p1<=mid)sta[p3++]=a[p1++];//将剩余的序列放进去 while (p2<=r)sta[p3++]=a[p2++]; for (p1=l,p3=1;p1<=r;p1++,p3++) { a[p1]=sta[p3];//将排好序的序列 放回原序列 } //然后我们就将这种逆序对统计下来。 //那我们就在第一个while第二个 else统计
return0不打了QWQ
}