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

来源:互联网 发布:js页面获取当前时间 编辑:程序博客网 时间:2024/05/18 01:38

Think:
讲区间不断二分,然后进行排序,在MergeSort的过程中不断递归。也就是即先使每个子序列有序,再使子序列段间有序。。。大概就是这样~~~得斯~~

PS:你偷走了我的影子,不论你在哪里,我都会一直想着你

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

输出逆序数。
Example Input

10
10 9 8 7 6 5 4 3 2 1

Example Output

45

#include<stdio.h>int a[100050], b[100050];long long int ans;void caifen(int s, int n);void Merge(int s1, int e1, int s2, int e2);int main() {    int n, i;    ans = 0;    scanf("%d",&n);    for (i = 0;i <= n - 1;i ++)     {        scanf("%d",&a[i]);     }     caifen(0, n - 1);    printf("%lld\n",ans);    return 0; } void caifen(int s, int n)  {     int m;     if (s < n)        {           m = (s + n) / 2;           caifen(s, m);           caifen(m + 1, n);           Merge(s, m, m + 1, n);        }  }  void Merge(int s1, int e1, int s2, int e2)   {      int i, j, k, t;      k = 0;i = s1;j = s2;      while(i <= e1&&j <= e2)        {           if (a[i] <= a[j])              b[k ++] = a[i ++];            else             {               b[k ++] = a[j ++];               ans = ans + e1 - i + 1;             }        }       while(i <= e1)           b[k ++] = a[i ++];        while(j <= e2)        b[k ++] = a[j ++];        for (t = s1;t <= e2;t ++)            a[t] = b[t - s1];   }/***************************************************User name: Result: AcceptedTake time: 48msTake Memory: 888KBSubmit time: 2017-02-23 19:21:52****************************************************/
0 0
原创粉丝点击