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

Problem Description

对于数列a1,a2,a3…中的任意两个数ai,aj (i < j),如果ai > aj,那么我们就说这两个数构成了一个逆序对;在一个数列中逆序对的总数称之为逆序数,如数列 1 6 3 7 2 4 9中,(6,4)是一个逆序对,同样还有(3,2),(7,4),(6,2),(6,3)等等,你的任务是对给定的数列求出数列的逆序数。

Input

输入数据N(N <= 100000)表示数列中元素的个数,随后输入N个正整数,数字间以空格间隔。

 

Output

输出逆序数。

Sample Input

10
10 9 8 7 6 5 4 3 2 1

Sample Output

45

Hint

Source

xam

思路:

题目要求求逆序数,其实就是要求求把一个序列排序好,所要交换的次数。归并排序是把一个序列分成有序的序列,然后有序序列两两归并,最后使原序列便成为有序的序列。

代码如下:

#include
#include
#include

int n ;
int a[100001] ;
int b[200001] ;
long long  num ;

void g_sort(int left, int right)
{
    if(left>=right)
    {
        return ;
    }
    int mid = (left+right)/2 ;
    g_sort(left,mid) ;
    g_sort(mid+1,right) ;
    int cmd  = 0 ;
    int i , j ;
    i = left ;
    j = mid+1 ;
    while(i<=mid&&j<=right)
    {
        if(a[i]>a[j])
        {
            num+=mid-i+1;
            b[cmd++] = a[j++] ;
        }
        else b[cmd++] = a[i++] ;
    }
    for(;j<=right ;)
    {
        b[cmd++]=a[j++] ;
    }
    while(i<=mid)
    {
        b[cmd++] = a[i++] ;
    }
    for(i = 0,j=left ; i

 

你可能感兴趣的:(排序,c,sdut)