Description
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.
Input
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.
Output
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.
Sample Input
5
9
1
0
5
4
3
1
2
3
0
Sample Output
6
0
归并排序求逆对序数
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
const int maxn=500000+10;
int c[maxn];
ll sum;
void merge(int a[],int first,int mid,int last,int c[])
{
int i=first,j=mid+1;
int m=mid,n=last;
int k=0;
while(i<=m||j<=n)
{
if(j>n||(i<=m&&a[i]<=a[j]))
c[k++]=a[i++];
else
{
c[k++]=a[j++];
sum+=(m-i+1);
}
}
for(i=0;i<k;i++)
a[first+i]=c[i];
}
void merge_sort(int a[],int first,int last,int c[])
{
if(first<last)
{
int mid=(first+last)/2;
merge_sort(a,first,mid,c);
merge_sort(a,mid+1,last,c);
merge(a,first,mid,last,c);
}
}
int main()
{
int n,i;
int a[maxn];
while(~scanf("%d",&n),n)
{
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
sum=0;
merge_sort(a,0,n-1,c);
printf("%I64d\n",sum);
}
return 0;
}
本文介绍了一种名为Ultra-QuickSort的排序算法,并详细解释了如何通过归并排序来计算输入序列所需的最少交换次数以达到升序排列。文章提供了一个C++实现示例,演示了如何使用归并排序来计算逆序对的数量。
694

被折叠的 条评论
为什么被折叠?



