• 7-2 求逆序对数目 (20分) 归并排序 O(nlogn)


    输入样例:

    在这里给出一组输入。例如:

     6
    -42 23 6 28 -100 65537

    输出样例:

    在这里给出相应的输出。例如:

    5

    #include <iostream>
    using namespace std;
    int count=0;
    //合并两个有序线性表 (两个线性表在一个线性表内)== 给数组 A 排序
    void Merge(int A[],int low,int mid,int high ){
    int B[1000];
    int i,j,k;

    for(k=low;k<=high;k++){ //复制A到B中
    B[k]=A[k];
    }

    for(i=low,j=mid+1,k=i;i<=mid && j<=high ;k++){ //在B数组中分两段 按顺序两两比较 选取较小的给A数组
    if(B[i]<=B[j]) A[k]=B[i++];
    else
    {
    A[k]=B[j++];
    count=count+(mid-i+1); // 计算逆序
    }
    }

    while(i<=mid){
    A[k++]=B[i++];
    }
    while(j<=high){
    A[k++]=B[j++];
    }
    }

    void MergeSort(int A[],int low ,int high){ // 算法 MergeSort 的递归过程只是将待排集合一分为二,直至待排序列只剩下一个元素为止
    if(low<high){
    int mid = (low+high)/2;
    MergeSort(A,low,mid);
    MergeSort(A,mid+1,high);
    Merge(A,low,mid,high);
    }
    }

    int main(){
    int n;
    cin>>n;
    int A[1000];
    for(int i=0;i<n;i++){
    cin>>A[i];
    }
    MergeSort(A,0,n-1);
    cout<<count<<endl;
    return 0;
    }

  • 相关阅读:
    BZOJ 3531[Sdoi2014]旅行
    BZOJ4998 星球联盟
    BZOJ2959 长跑
    【北京集训D2T3】tvt
    [Bzoj]5343: [Ctsc2018]混合果汁
    HGOI20190810 省常中互测3
    HGOI20190809 省常中互测2
    HGOI20190808 省常中互测1
    组合排列和组合数 学习笔记
    2-SAT (two-statisfiability) 算法 学习笔记
  • 原文地址:https://www.cnblogs.com/lvjingyuan/p/13745331.html
Copyright © 2020-2023  润新知