冒泡排序的过程,就是消除逆序对的过程。把所以逆序对都消除了,就得到了一个从小到大排列的序列。
冒泡排序每一次交换, 就是交换一个相邻的逆序对,该交换不会影响到其它的逆序对,所以可以计算冒泡排序在排序过程一共进行了多少次交换,由此得出数组的逆序对数。
题目描述
有一实数序列A[1]、A[2] 、A[3] 、……A[n-1] 、A[n] (n<=1000),若i<j,并且A[i]>A[j],则称A[i]与A[j]构成了一个逆序对,求数列A中逆序对的个数。
例如,5 2 4 6 2 3 2 6
,可以组成的逆序对有
(5 2),(5 4),(5 2),(5 3),(5 2),
(4 2),(4 3),(4 2),
(6 2),(6 3),(6 2),
(3 2)
共:12个
输入描述
共两行,第一行有一个正整数n,第二行有n个整数。
输出描述
只有一行为逆序对个数。
输入样例
8
5 2 4 6 2 3 2 6
输出样例
12
//cccc
#include <iostream>
using namespace std;
int a[1005];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
int cnt=0;
for(int i=1;i<n;i++)
for(int j=1;j<n+1-i;j++){
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
cnt++;
}
}
cout<<cnt<<endl;
}