当前位置:   article > 正文

C语言 数据结构排序与查找 数据结构实验之排序五:归并求逆序数_1335、c语言实验五(指针):题目2、排序与查找

1335、c语言实验五(指针):题目2、排序与查找

数据结构实验之排序五:归并求逆序数
Time Limit: 50MS Memory Limit: 65536KB
Submit Statistic
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>
#include <string.h>
#include <stdlib.h>
long long int num;
int a[100100],b[100100];
void node(int a[],int l,int mid,int r)
{
    int i = l,j = mid + 1,k = l;
    while(i <= mid && j <= r)
    {
        if(a[i] <= a[j])
            b[k++] = a[i++];
        else
        {
            num += j - k;
            b[k++] = a[j++];///只有当后边的数小的时候存在逆序数,用mid的下标-当前的下表
        }
    }

    while(i <= mid)
        b[k++] = a[i++];
    while(j <= r)
        b[k++] = a[j++];
    for(i = l; i <= r; i++)
        a[i] = b[i];
}

void sort(int a[],int l,int r)  ///归并排序
{
    if(l < r)
    {
        int mid = (l + r)/2;
        sort(a,l,mid);/// 将前半部分排序
        sort(a,mid+1,r);/// 将后半部分排序
        node(a,l,mid,r);/// 合并前后两个部分
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    int i;
    for(i = 0; i < n; i++)
        scanf("%d",&a[i]);
    num = 0;
    sort(a,0,n-1);
    printf("%lld\n",num);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/807630
推荐阅读
相关标签
  

闽ICP备14008679号