码迷,mamicode.com
首页 > 编程语言 > 详细

算法基础题 - 逆序数,归并排序

时间:2017-12-06 19:40:54      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:位置   ons   printf   turn   逆序   cstring   基础   main   space   

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。

-----------------------------------------------------------------------------

二分排序的思想,合并两个有序数列a,b时,如果序列b队首元素小则逆序数增加序列a的当前长度。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 50500;
int A[2][N];
int main(){
    long long ans = 0;
    int n;cin>>n;
    for(int i=0;i<n;i++) scanf("%d",A[0]+i);

    bool flag = false;
    int aid,bid,cid;
    for(int stride = 1;stride<n;stride<<=1){
        for(int i=0;i<n;i+=(stride<<1u)){
            bid = (cid = aid = i) + stride;

            int aed = std::min(bid,n);
            int bed = std::min(bid+stride,n);

            while(aid<aed&&bid<bed){
                if(A[flag][aid]<=A[flag][bid]){
                    A[!flag][cid++] = A[flag][aid++];
                }
                else{
                    A[!flag][cid++] = A[flag][bid++];
                    ans+=aed-aid;
                }
            }
            while(aid<aed) A[!flag][cid++] = A[flag][aid++];
            while(bid<bed) A[!flag][cid++] = A[flag][bid++];
        }
        flag = !flag;
    }
    printf("%lld\n",ans);
    return 0;
}

 

算法基础题 - 逆序数,归并排序

标签:位置   ons   printf   turn   逆序   cstring   基础   main   space   

原文地址:http://www.cnblogs.com/redips-l/p/7994006.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!