计蒜客习题:排序

问题描述

你需要分析排序算法,将 n 个互不相同的整数,通过交换两个相邻的元素使得数列有序的 最少交换次数。
比如,原数列为:
9,1,0,5,4
排序后的数列为:
0,1,4,5,9
输入格式
第一行一个整数 n(n≤500000)。
接下来 n 行,每行一个整数 ai(ai≤10^9)。
输出格式
输出一个整数,表示操作次数。
样例输入

5
9
1
0
5
4

样例输出

6

AC代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <cstring>
using namespace std;
const int MAX_N=500050;
int num[MAX_N];  
int temp[MAX_N];  
int C[MAX_N];  
int ans[MAX_N];
int n,m;
map<int,int> mp;

int lowbit(int p){
    return p&(-p);
}

void change(int p){
    for(;p<=n;p+=lowbit(p)){
        C[p]++;
    }
    return;
}

int getsum(int p){
    int res=0;
    for(;p;p-=lowbit(p)){
        res+=C[p];
    }
    return res;
}

int main(){
    cin>>n;
    memset(C,0,sizeof(C));
    for(int i=0;i<n;i++){
        scanf("%d",&num[i]);
        temp[i]=num[i];
    }
    sort(temp,temp+n);
    m=unique(temp,temp+n)-temp;
    for(int i=0;i<m;i++){
         mp[temp[i]]=i+1;
    }
    long long int myans=0;
    for(int i=0;i<n;i++){
        ans[i]=mp[num[i]];
        change(ans[i]);
        myans+=i+1-getsum(ans[i]);
    }
    cout<<myans;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/liukairui/article/details/80921193