每日一道算法题之求排列的逆序数
- 一、题目描述
- 二、思路
- 三、C++代码
一、题目描述
一个排列含有逆序的个数称为这个排列的逆序数。例如排列 263451 含有8个逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此该排列的逆序数就是8。显然,由1,2,…,n 构成的所有n!个排列中,最小的逆序数是0,对应的排列就是1,2,…,n;最大的逆序数是n(n-1)/2,对应的排列就是n,(n-1),…,2,1。逆序数越大的排列与原始排列的差异度就越大。现给定1,2,…,n的一个排列,求它的逆序数。
C++程序要求输入输出如下:
输入
第一行是一个整数n,表示该排列有n个数(n <= 100000)。
第二行是n个不同的正整数,之间以空格隔开,表示该排列。
输出
输出该排列的逆序数。
示例如下:
输入:6 输出:82 6 3 4 5 1
二、思路
直接暴力法。
三、C++代码
#include<bits/stdc++.h>
using namespace std;//求排列的逆序数
const int maxsize=1000;
int a[maxsize]; int main(){int n;cin>>n;for(int i=0;i<n;i++){cin>>a[i];} int number=0;for(int i=0;i<n-1;i++){for(int j=i+1;j<n;j++){if(a[j]<a[i]){number++;}}}cout<<number;
}