计算逆序数

#include <stdio.h>  

#include <string.h>  

#include <stdlib.h>  

int Divid(int* a, int* b, int first, int last) {  

    if(first >= last) return 0;  // 一个元素的情况下没有逆序数  

     int i,j,k=0,mid;  

     k=i=first;  

     int res=0;  

     mid=(first+last)/2;  

     j=mid+1;  

     res=Divid(a,b,i,mid)+Divid(a,b,j,last);  // 递归计算两边的逆序数  

     // 计算两边相关联的数据的逆序数  

     while((i<=mid) && (j<=last)) {  

        if(a[i]<=a[j]) b[k++]=a[i++],res+=j-mid-1;  

        else b[k++]=a[j++];   // 是不是没有考虑a[i]=a[j]的问题   

     }  

     while(i<=mid) b[k++]=a[i++],res+=j-mid-1;  

     while(j<=last) b[k++]=a[j++];  

    // memcpy(a+first,b+first,sizeof(int)*(first-last+1));  

     for(i=first; i<=last;++i)  

        a[i]=b[i];  

     return res;  

}  

int main() {  

    int n;  

printf(“Enter n:”);

    scanf(“%d”,&n);  

    int* a=(int*) calloc(n, sizeof(int));  

    int* b=(int*) calloc(n, sizeof(int));  

    int i=0; 

printf(“Enter %d intrgers:”,n);

    for(i=0;i<n;++i) {  

        scanf(“%d”,(a+i));  

    }  

    printf(“%lld”,Divid(a,b,0,n-1));    

    return 0;  

    原文作者:蝶舞xue
    原文地址: https://blog.csdn.net/u013714062/article/details/40476535
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞