模板:
一个是将数组一分为二,一个无序的数组成为两个数组.
另外一个操作就是,合二为一,将两个有序数组合并成为一个有序数组.
双指针操作
int a[N];
int b[N];
void megre_sort(int a[],int l,int r){
if(l>=r) return ;
int mid=(l+r)/2;
megre_sort(a,l,mid),megre_sort(a,mid+1,r);// 递归排序left,right
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r){
if(a[i]<=a[j]) b[k++]=a[i++];
else b[k++]=a[j++];
}
//扫尾
while(i<=mid) b[k++]=a[i++];
while(j<=r) b[k++]=a[j++];
for(int i=l,j=0;i<=r;i++,j++) a[i]=b[j];//物归原主
}
题目链接:归并排序
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int a[N];
int b[N];
void sort_dl(int a[],int l,int r){
if(l>=r) return ;
int mid=(l+r)/2;
sort_dl(a,l,mid),sort_dl(a,mid+1,r);// 递归排序left,right
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r){
if(a[i]<=a[j]) b[k++]=a[i++];
else b[k++]=a[j++];
}
//扫尾
while(i<=mid) b[k++]=a[i++];
while(j<=r) b[k++]=a[j++];
for(int i=l,j=0;i<=r;i++,j++) a[i]=b[j];//物归原主
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort_dl(a,0,n-1);
for(int i=0;i<n;i++){
cout<<b[i]<<" ";
}
return 0;
}
题目链接:逆序对的数量
#include<iostream>
using namespace std;
typedef long long LL;
const int N=1e5+10;
int n;
int q[N],tp[N];
LL megsort(int l,int r){
if(l>=r) return 0;
int mid=l+r>>1;
LL sum=megsort(l,mid)+megsort(mid+1,r);
//归并排序过程
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r){
if(q[i]<=q[j]) tp[k++]=q[i++];
else{
tp[k++]=q[j++];
sum+=mid-i+1;
}
}
// 扫尾
while(i<=mid) tp[k++]=q[i++];
while(j<=r) tp[k++]=q[j++];
//物归原主
for(int i=l,j=0;i<=r;i++,j++) q[i]=tp[j];
return sum;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>q[i];
}
cout<<megsort(0,n-1)<<endl;
return 0;
}