• 归并排序应用-求逆序对数量


    题目:

    给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。

    逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。

    输入格式

    第一行包含整数n,表示数列的长度。

    第二行包含 n 个整数,表示整个数列。

    输出格式

    输出一个整数,表示逆序对的个数。

    数据范围

    1n1000001≤n≤100000

    输入样例:

    6
    2 3 4 5 6 1
    

    输出样例:

    5

    代码:

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 const int N = 1e7;
     6 
     7 long arr[N];
     8 long help[N];
     9 int n;
    10 
    11 long long ans;
    12 
    13 void union_sort(int l, int r){
    14     if(l >= r)return;
    15     int mid = l + r >> 1;
    16     union_sort(l, mid);
    17     union_sort(mid+1,r);
    18     int i = l, j = mid + 1, k = 1;
    19     while(i <= mid && j <= r){
    20         if(arr[i] <= arr[j])
    21             help[k++] = arr[i++];
    22         else{
    23             help[k++] = arr[j++];
    24             ans += mid - i + 1;
    25         }
    26     }
    27     while(i <= mid)help[k++] = arr[i++];
    28     while(j <= r)help[k++] = arr[j++];
    29     for(int i = l, j = 1;i <= r;++i)
    30         arr[i] = help[j++];
    31 }
    32 
    33 int main(){
    34     cin >> n;
    35     for(int i = 1;i <= n;++i)cin >> arr[i];
    36     union_sort(1, n);
    37     cout << ans;
    38     return 0;
    39 }
    View Code
  • 相关阅读:
    (十六)字段表集合
    (十五)类索引
    (十四)访问标志 Access_flags
    (一)单例模式
    (二十三)IDEA 构建一个springboot工程,以及可能遇到的问题
    (十三)class文件结构:常量池(转)
    Hive优化
    标签整理
    一些学习资料
    jstree树形菜单
  • 原文地址:https://www.cnblogs.com/sxq-study/p/12378693.html
Copyright © 2020-2023  润新知