zoukankan      html  css  js  c++  java
  • 归并法计算数组中的逆序数对

    1.什么是逆序数对?
    在数组a中如果a[i]>a[j].且i<j则<i,j>称为一个逆序数对

    #include<iostream>
    using namespace std;
    #define MAX 1000;
    void main()
    {  int  Calculate(int *A,int begin,int end,int mid);
      int CountInversions(int *A,int begin,int end);
      int A[5]={5,4,3,4,1};
      
      int result=CountInversions(A,0,4);
      cout<<result<<endl;
     
     char f;
     cin>>f;
    }


    int CountInversions(int *A,int begin,int end)
    {  int Calculate(int *A,int begin,int end,int mid);
     int  count=0;
     if(begin<end)
     {
      int mid=(begin+end)/2;
      count+=CountInversions(A,begin,mid);
      count+=CountInversions(A,mid+1,end);
      count+=Calculate(A,begin,end,mid);
      
     }
    return count;
    }
    int Calculate(int *A,int begin,int end,int mid)
    {
        int cnt=0;
        //bool counted=false;
     int n1=mid-begin+1;
     int n2=end-mid;
     int *L=new int[n1+1];
     int *R=new int[n2+1];
     for(int m=0;m<n1;m++)
     {
      L[m]=A[begin+m];

     }
     for(int m=0;m<n2;m++)
     {
      R[m]=A[mid+1+m];
     }
     L[n1]=MAX;
     R[n2]=MAX;
     int  i=0;
     int  j=0;
     for(int k=begin;k<=end;k++)
     {  
      
     
      if(L[i]<=R[j])
      {  A[k]=L[i];
       i++;
      }
      else
      {  A[k]=R[j];
       j++;
       cnt=n1-i+cnt;
      }
     }
     delete[]L;
     delete []R;
     return cnt;

    }

  • 相关阅读:
    Android平板电脑开发实战详解和典型案例
    UG NX10.0技术大全(不附光盘)
    SolidWorks 2018中文版机械设计应用大全
    1192.回文字符串
    1193.矩阵转置
    1195.最长&最短文本
    1194.八进制
    1196.成绩排序
    1197.奇偶检验
    1199.找位置
  • 原文地址:https://www.cnblogs.com/finallyliuyu/p/1545302.html
Copyright © 2011-2022 走看看