描述
给定输入n,之后输入1到n的一个排列,求排列中的逆序对的个数;
想法
思路一:
- 找到序列中的最大数(记其下标为i),则前面的所有数都不会和这个数形成逆序,后面的所有数和这个数都是一个逆序对,从而有n-i-1个逆序对;
- 删掉这个数,则剩下的数形成n-1规模的子问题,递归执行;
用链表存储数据,可以节省删除元素后移动剩余元素的时间,加快执行速度;时间复杂度O(n^2)
思路二:
- 利用归并排序的思想,将问题分解为两个子部分,要求两个子部分有序,然后归并两个子部分,归并过程计算出子部分间的逆序数,返回给上一层函数;
- 递归终止条件是当只有一个数的时候,返回逆序数为0;
- 时间复杂度和归并排序相同,为O(n*logn)
思路二代码实现:
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
//归并,并计算出逆序数的个数
int Merge(int a[],int s,int mid,int e,int b[]){
int i=s;
int j=mid