zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    Redpine的Lite-Fi解决方案获Wi-Fi CERTIFIED认证
    植物园偶遇一直喵
    美食篇
    端午节路过南站
    黄山云海
    一品黄山 天高云淡
    黄山的日出日落
    宏村,寻找你的前世今生
    git把本地文件上传到github上的步骤
    一张照片一个故事
  • 原文地址:https://www.cnblogs.com/lvjingyuan/p/13745331.html
Copyright © 2011-2022 走看看