归并排序&归并排序求逆序对

1.归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略

2.归并排序是稳定排序

3.归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。

例子:

 

 注:逆序对在代码标注中

关于归并排序求逆序对原理,请自行百度

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<string>
 6 #include<queue>
 7 #include<cmath>
 8 #define ll long long
 9 #define DB double
10 #define inf 214748360000
11 #define mod 1000000007
12 using namespace std;
13 const int N=1e5+90;
14 int n,a[N*60],b[N*60];
15 ll ans;//ans为逆序对个数 
16 void merge_sort(int l,int r)
17 {
18     if(l==r) return;
19     int mid=(l+r)/2,i,j,k;
20     i=l;k=l;j=mid+1;
21     merge_sort(l,mid);
22     merge_sort(mid+1,r);
23     while(i<=mid && j<=r)
24     {
25         if(a[i]<=a[j]) b[k++]=a[i++];
26         else ans+=mid-i+1,b[k++]=a[j++]; 
27     }
28     while(i<=mid) b[k++]=a[i++];
29     while(j<=r) b[k++]=a[j++];
30     for(int o=l;o<=r;++o) a[o]=b[o];
31 }
32 int main()
33 {
34     scanf("%d",&n);
35     for(int i=1;i<=n;++i) scanf("%d",&a[i]);
36     merge_sort(1,n);
37     for(int i=1;i<=n;++i) printf("%d ",a[i]);
38 //    printf("%lld",ans);
39     return 0;
40 }
View Code
原文地址:https://www.cnblogs.com/adelalove/p/8484644.html