归并排序求逆序对数目

来源:互联网 发布:手机淘宝么注册网店 编辑:程序博客网 时间:2024/06/01 10:08

给出一个算法,它在最坏情况下运行时间为O(nlogn),确定n个元素的任何排序中逆序对的数目。

    #include <stdio.h>      #include <stdlib.h>      int s[1000000],r[1000000],p=0;//变量p记录逆序对数量      void merge(int s[],int f,int m,int n,int r[]) //将s中相邻两个子文件合并至r中相同位置      {          int i=f,j=m+1,k=f;          while(i<m+1&&j<n+1)          {              if(s[j]<s[i])              {                  r[k]=s[j];                  ++j;                  p+=m-i+1;//逆序对增加              }              else              {                  r[k]=s[i];                  ++i;              }              ++k;          }          for(; i<m+1; ++i,++k) r[k]=s[i];          for(; j<n+1; ++j,++k) r[k]=s[j];      }      void mpass(int s[],int n,int len,int r[])//一趟合并      {          int i=0,j=i+len;          while(j+len-1<n)          {              merge(s,i,j-1,j-1+len,r);              i+=2*len;              j=i+len;          }          if(j<n) merge(s,i,j-1,n-1,r);          else          {              while(i<n)              {                  r[i]=s[i];                  ++i;              }          }      }      void msort(int s[],int n)//归并排序      {          int len=1;          while(len<n)          {              mpass(s,n,len,r);              len*=2;              mpass(r,n,len,s);              len*=2;          }      }            int main()      {          printf("输入排序个数:\n");          int n;          scanf("%d",&n);          int i;          for(i=0; i<n; i++)              scanf("%d",&s[i]);          msort(s,n);          printf("%d\n",p);          return 0;      }  


0 0
原创粉丝点击