数据结构实验之排序五:归并求逆序数

来源:互联网 发布:新浪云绑定独立域名 编辑:程序博客网 时间:2024/04/28 02:43


这道题的算法思想就是将数组中的元素分成单独的序列,即每个元素都是一个序列,然后比较它们的大小,对它们进行归并排序,并统计其中的逆序数即可

代码如下:

#include<stdlib.h>
#include<stdio.h>
int temp[100001],elem[100001];//这里定义了一个暂时储存的数组,和一个输入数组、
long long sum;
void merger(int low,int mid,int x,int high)
{
    int len=0,i;
    int top=low,end=x;
    while(top<=mid&&end<=high)//这个函数里面就是归并排序了。
    {
        if(elem[top]<=elem[end])
        {
            temp[len++]=elem[top++];
        }
        else
        {
            temp[len++]=elem[end++];
            sum+=mid-top+1;//对这个题来说,在统计逆序数时,就是计算前一个数组的元素个数。(这里是两个数组的合并)
        }
    }
    while(top<=mid)
        temp[len++]=elem[top++];
    while(end<=high)
        temp[len++]=elem[end++];
    for(i=low; i<=high; i++)//这里必须注意一下,从前一个数组的头开始存储。
    {
        elem[i]=temp[i-low];
    }
}


void merger_sort(int low,int high)//在这里开始归并排序的第一个步骤,那就是把要求排序的数组都分成单独的一个数,这样单独的每一个数就是有序的。
//然后在进行归并的过程。
{
    int mid=(high-low)/2+low;
    if(low<high)
    {
        merger_sort(low,mid);//这两个递归就是分的过程。
        merger_sort(mid+1,high);
        merger(low,mid,mid+1,high);//在这里就是归并的过程,如果实在不能清楚再归并回溯时数组的情况,建议你画画图。
    }
}
int main()
{
    int n,i;
    sum=0;
    scanf("%d",&n);
    for(i=1; i<=n; i++)
        scanf("%d",&elem[i]);
    merger_sort(1,n);
    printf("%lld\n",sum);
    return 0;
}

0 0
原创粉丝点击