基础算法(蓝桥杯)--全球最通俗易懂的归并排序

B站视频链接:A14 归并排序 逆序对_哔哩哔哩_bilibili

1、题目链接:【模板】排序 - 洛谷

基础算法(蓝桥杯)--全球最通俗易懂的归并排序_第1张图片

#include 
using namespace std;

const int N = 100010;
int n,a[N],b[N]; //b为辅助数组

void msort(int l, int r){
  if(l==r) return;
  int mid=l+r>>1;
  msort(l,mid);
  msort(mid+1,r); //拆分

  int i=l,j=mid+1,k=l; //合并
  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(i=l; i<=r; i++) a[i]=b[i];
}

int main(){
  scanf("%d",&n);
  for(int i=0;i

2、题目链接:逆序对 - 洛谷

基础算法(蓝桥杯)--全球最通俗易懂的归并排序_第2张图片

#include 
using namespace std;

int n,a[500010],b[500010];
long long res;

void merge(int l,int r){
  if(l>=r) return;
  int mid=l+r>>1;
  merge(l,mid); 
  merge(mid+1,r); //拆分
  
  int i=l,j=mid+1,k=l; //合并
  while(i<=mid && j<=r){
    if(a[i]<=a[j]) b[k++]=a[i++];
    else b[k++]=a[j++], res+=mid-i+1;
  }
  while(i<=mid) b[k++]=a[i++];
  while(j<=r) b[k++]=a[j++];
  for(i=l; i<=r; i++) a[i]=b[i];
}

int main(){
  cin>>n;
  for(int i=0;i

你可能感兴趣的:(算法,算法,蓝桥杯,数据结构,排序算法)