微软面试题:求一个序列的逆序对数

Posted joelwang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微软面试题:求一个序列的逆序对数相关的知识,希望对你有一定的参考价值。

 

双层循环排序,时间为O(n2)

归并排序时间为O(nlog(n))

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int cnt=0;
void merge(vector<int> & nums,int left,int mid,int right);
void mergesort(vector<int> & nums,int start,int end);
int main(){
    int exa[8]={1, 7, 2, 9, 6, 4, 5, 3};
    vector<int> arr;
    for(int i=0;i<8;i++){
        arr.push_back(exa[i]);
    }
    mergesort(arr,0,arr.size()-1);
    printf("逆序对数为: %d
",cnt);
    return 0;
}
void merge(vector<int> &nums,int left,int mid,int right){
    vector<int> temp;
    int l=left,r=right;
    while(l<=mid && r<=right){
        if(nums[l]>nums[r])
            {temp.push_back(nums[r++]);cnt+=mid-l+1;}
        else
            temp.push_back(nums[l++]);
    }
    while(l<=mid)
        temp.push_back(nums[l++]);
    while(r<=mid)
        temp.push_back(nums[r++]);
    for(int i=0;i<temp.size();i++)
        nums[left+i]=temp[i];
}
void mergesort(vector<int> &nums,int start,int end){
    if(start>=end) return;
    int mid=(end-start)/2+start;
    mergesort(nums,start,mid);
    mergesort(nums,mid+1,end);
    merge(nums,start,mid,end);
}

 

以上是关于微软面试题:求一个序列的逆序对数的主要内容,如果未能解决你的问题,请参考以下文章

利用归并排序法计算一个序列里有多少逆序对数(详细讲解)

逆序对的三种解法

一道编程题:求逆序对的个数

bzoj 3295 动态逆序对

[ARC054D]バブルソート

XJTUOJ wmq的队伍(树状数组求 K 元逆序对)