用归并解决逆序对

该博客介绍了如何使用归并排序算法在C语言中找到一个无序序列中的逆序对。代码示例展示了一个包含逆序对计数的归并排序过程,满足O(nlogn)的时间复杂度要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:一个无序序列,找出其中的逆序对。要求时间复杂度为O (nlogn).关于对于一个包含N个非负整数的数组A[1…n],如果有i< j,且A[i]>A[j],则(A[i], A[j])
例如,数组(3.1,4,5,2)的逆序对有(3,1).(3,.2).(4,2).(5.2),共4个。

语言:c语言
平台:code::block、windows
代码:

int main()
{
    int arr[maxsize]={3,1,4,5,2};

    int low = 0, high = 4;
    MergeSort(arr, low, high);
    printf("排序后:");
    for(int i=0;i<5;i++)
    {
        printf("%d ", arr[i]);

    }


}
void MergeSort(int arr[], int low, int high)
{
    if(low<high)
    {
        int mid = (high+low)/2;
        MergeSort(arr, low, mid);
        MergeSort(arr, mid+1, high);
        Merge(arr, low, mid, high);
    }
}
void Merge(int arr[],int low, int mid, int high)
{
    int B[maxsize];
    int i,j,k;
    for(i=low;i<=high;i++)
    {
        B[i] = arr[i];
    }

    for(i=low, j=mid+1, k=low; i<=mid && j<=high;k++)
    {
        if(B[i]<=B[j])
        {

            arr[k] = B[i++];
        }
        else
        {
            for(int m=i;m<=mid;m++)
            {
                printf("逆序对:(%d, %d)\n", B[m], B[j]);

            }
            arr[k] = B[j++];
        }

    }
    while(i<=mid)
    {
        arr[k++] = B[i++];

    }
    while(j<=high)
    {
        arr[k++] = B[j++];
    }

}

因为是对数据操作,而且是nlog(n), 很容易联想到关于数据结构中排序的知识。
在这里插入图片描述
则只有希尔、归并、快排序、堆排序,因为需要保持每一组操作后,剩下的相对位置不能变化,所以只有归并排序合适,因为它是自下而上的,在每一层中它的那一块都是排序好的(结果已经输出了),而块与块的相对位置也没有变。正好。
一开始只想到了快排,但操作来操作去都解决不了位置的问题。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值