归并排序求逆序对数目

给出一个算法,它在最坏情况下运行时间为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;  
    }  


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值