题目描述
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence
9 1 0 5 4 ,
Ultra-QuickSort produces the output
0 1 4 5 9 .
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
输入
The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.
输出
For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.
样例输入
5 9 1 0 5 4 3 1 2 3 0
样例输出
6 0
比较和交换相邻两个数,来将原序列排序,实际上就是在冒泡排序。
我们改变相邻两个数,只会在原序列中减少一对逆序对,所以求最少次数也就是求原序列逆序对数。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[500050],r[500050],ans;
void msort(int s,int t)
{
if(s==t) return;
int mid=(s+t)/2;
msort(s,mid);
msort(mid+1,t);
int i=s,j=mid+1,k=s;
while(i<=mid&&j<=t)
{
if(a[i]<a[j])
{
r[k]=a[i];
k++;
i++;
}
else
{
r[k]=a[j];
k++;
j++;
ans+=mid-i+1;
}
}
while(i<=mid)
{
r[k]=a[i];
k++;
i++;
}
while(j<=t)
{
r[k]=a[j];
k++;
j++;
}
for(int i=s; i<=t; i++)
a[i]=r[i];
}
int main()
{
int n;
while(1)
{
scanf("%d",&n);
if(n==0)
{
return 0;
}
ans=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
msort(1,n);
printf("%lld\n",ans);
}
return 0;
}