归并排序求逆序

来源:互联网 发布:python 判断中英文 编辑:程序博客网 时间:2024/05/11 20:01
#include <iostream>
using namespace std;
 
constint MAXN = 1000;
intA[MAXN], T[MAXN];
 
voidmerge_sort(int*A, intx, inty, int*T) {
    if(y - x > 1) {
        intm = x + (y - x) / 2;    //划分
        intp = x, q = m, i = x;
        merge_sort(A, x, m, T);      //递归求解
        merge_sort(A, m, y, T);      //递归求解
        while(p < m || q < y) {
            if(q >= y || (p < m && A[p] <= A[q])) T[i++] = A[p++];   //从左半数组复制到临时空间
            elseT[i++] = A[q++];    //从右半数组复制到临时空间
        }
        for(i = x; i < y; ++i) A[i] = T[i];   //从辅助空间复制回A数组
    }
}
 
intmain() {
    intn;
    cin >> n;
    for(inti = 0; i < n; ++i) cin >> A[i];
    merge_sort(A,0, n, T);
    for(inti = 0; i < n; ++i) cout << A[i] << endl;
    return0;

}



#include <iostream>
using namespace std;
 
constint MAXN = 1000;
intA[MAXN], T[MAXN];
 
voidinverse_pair(int*A, intx, inty, int* cnt, int*T) {
    if(y - x > 1) {
        intm = x + (y - x) / 2;    //划分
        intp = x, q = m, i = x;
        inverse_pair(A, x, m, cnt, T);      //递归求解
        inverse_pair(A, m, y, cnt, T);      //递归求解
        while(p < m || q < y) {
            if(q >= y || (p < m && A[p] <= A[q])) T[i++] = A[p++];   //从左半数组复制到临时空间
            else{
                T[i++] = A[q++];    //从右半数组复制到临时空间
                *cnt += m-p;  //更新累加器
            }
        }
        for(i = x; i < y; ++i) A[i] = T[i];   //从辅助空间复制回A数组
    }
}
 
intmain() {
    intn;
    cin >> n;
    for(inti = 0; i < n; ++i) cin >> A[i];
    intcnt = 0;
    inverse_pair(A,0, n, &cnt, T);
    cout << cnt << endl;
    return0;
}


#include<iostream>
#include<cstdio>
using namespace std;
#define max 100005
struct point{
    int h;
    int t;//统计该元素左边比他大的数的个数和该元素右边比他小的数的个数的总和 
};
point l[max],r[max],c[max];
void Merge(point *a,int first,int last){//归并时,上数组的第一个元素与下数组的第一个元素相等,上数组的指针右移 
    int p,q,temp,mid;
    mid=(first+last)/2;
    temp=first;
    p=first;
    q=mid+1;
    while(p<=mid&&q<=last){
        if(a[p].h>a[q].h){
            a[q].t+=mid+1-p;//上数组的第一个元素比下数组的第一个元素大,下数组的第一个元素前面有mid+1-p个数比他大 
            c[temp++]=a[q++];
        }
        else{
            a[p].t+=q-1-mid;
            //上数组的第一个元素与下数组的第一个元素相等或者上数组的第一个元素比下数组的第一个元素小 
            //注意:上数组的第一个元素与下数组的第一个元素相等时,也就是说下数组的第一个元素的前面的元素都比上数组的第一个元素小 
            //上数组的第一个元素后面有q-1-mid个数比他小 
            c[temp++]=a[p++];    
        }
    }
    while(q<=last){//下数组有剩余 
            c[temp++]=a[q++];
    }
    q--;
    while(p<=mid){//上数组有剩余,也就是说下数组的所有元素都比上数组剩下的元素小,故上数组每个元素t加q-mid,也就是下数组的元素个数 
            a[p].t+=q-mid;
            c[temp++]=a[p++];
    }
    int i=first;
    for(;i<=last;i++){
        a[i]=c[i];
    }
}
void MergeSort(point *a,int first,int last){
    if(first==last){
        return;
    }
    int mid=(first+last)/2;
    MergeSort(a,first,mid);
    MergeSort(a,mid+1,last);
    Merge(a,first,last);
}
int main(){
    int n;
    scanf("%d",&n);
    //cout<<1<<endl;
    int i=0;
    for(;i<n;i++){
        scanf("%d",&(l[i].h));
        l[i].t=0;
    }
    MergeSort(l,0,n-1);
    long long sum=0;//数的范围
    for(i=0;i<n;i++){
        long long s=l[i].t;
        //cout<<"h: "<<l[i].h<<" "<<l[i].t<<endl;
        sum+=(s+1)*s/2;//求和 
    }
    cout<<sum<<endl;
    return 0;
}

蓝桥杯——小朋友排队

  1. #include <iostream>  
  2. #include <cstring>  
  3. #include <string>  
  4. #include <cstdio>  
  5. #include <cmath>  
  6. #include <map>  
  7. #include <algorithm>  
  8. using namespace std;  
  9.   
  10. typedef long long LL;  
  11.   
  12. LL count=0,n;  
  13.   
  14. struct Kids  
  15. {  
  16.     LL h;  
  17.     LL num;  
  18. }A[100005],T[100005];  
  19.   
  20. void merge_sort(int x, int y)  
  21. {  
  22.     if(y-x<=1)return;  
  23.     int m=x+(y-x)/2;  
  24.     int p=x,q=m,i=x;  
  25.     merge_sort(x,m);  
  26.     merge_sort(m,y);  
  27.     while(p<m || q<y)  
  28.     {  
  29.         if(q>=y || (p<m && A[p].h<=A[q].h))  
  30.         {  
  31.             T[i++] = A[p++];  
  32.             T[i-1].num += q-m;  
  33.         }  
  34.         else  
  35.         {  
  36.             T[i++] = A[q++];  
  37.             T[i-1].num += m-p;  
  38.         }  
  39.     }  
  40.     for(int i=x;i<y;++i)A[i]=T[i];  
  41. }  
  42.   
  43. int main()  
  44. {  
  45.     cin>>n;  
  46.     for(int i=0;i<n;i++)  
  47.     {  
  48.         scanf("%I64d",&A[i].h);//cin>>A[i].h;  
  49.         A[i].num=0;  
  50.     }  
  51.     merge_sort(0,n);  
  52.     LL count=0;  
  53.     for(int i=0;i<n;i++)count+=(A[i].num+1)*A[i].num/2;  
  54.     cout<<count<<endl;  
  55.     return 0;  
  56. }  

0 0
原创粉丝点击