c语言使用归并做这个题目的时候有什么方法可以优化吗?我的后面一大堆都是TLE

P1908 逆序对

XDY18LIUDENGLIN @ 2019-11-17 14:51:48

#include<stdio.h>
#include<stdlib.h>
void getSumFun(int *nums,int s,int m,int e,long long *sum)
{
    int i,j;
    for(i=s; i<=m; i++)
        for(j=m+1; j<=e; j++)
            if(nums[i]>nums[j]) (*sum)++;
}

void getSum(int *nums,int s,int e,long long *sum)
{
    int i,m;
    if(s<e)
    {
        m=s+(e-s)/2;
        getSum(nums,s,m,sum);
        getSum(nums,m+1,e,sum);
        getSumFun(nums,s,m,e,sum);
    }
}

int main()
{
    int N,i;
    long long sum;
    while(~scanf("%d",&N))
    {
        sum=0;
        int *nums=(int*)malloc(sizeof(int)*N);
        for(i=0; i<N; i++)
            scanf("%d",&nums[i]);
        getSum(nums,0,N-1,&sum);
        printf("%lld\n",sum);
    }
    return 0;
}

by babyec @ 2019-11-17 15:17:54

你归并的并的方法不对。

两个有序的小数组合并成一个大数组的复杂度可以在O(n),而不是你这样嵌套循环的,在合并的过程中因为前后两个小部分分别有序,可以直接计算出这次的逆序对个数,加到sum里。

而且好像并没有真的并,看起来有点像啥呢,选择?冒泡?

emmm...我建议你先好好看看归并排序的算法讲解


by XDY18LIUDENGLIN @ 2019-11-17 15:23:26

@babyec OK,我好好去看看,谢谢了


|