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
题意:
给出长度为n的序列,每次只能交换相邻的两个元素,问至少要交换几次才使得该序列为递增序列。
解
比赛的时候知道是归并排序但是很懵逼的是,时间不够。。。
要使得序列从小到大排序,那么大的数要换到后面去,所以,我们只需要求当前数字后面有几个比它小的数,每个数都求一下,和就是答案
例如:
9 1 0 5 4
9 后面比它小的有 1 0 4 5 (4个)
1 后面比它小的有 0 (1个)
0 后面没有比它小的 (0个)
5 后面比它小的有 4 (1个)
4 后面没有比它小的 (0个)
所以4+1+1=6次;
交换的次数等于序列中的逆序对数
对于归并排序求逆序数不会的可以参考一下:
归并排序求逆序数
归并排序求逆序数
#include <stdio.h>
#include <algorithm>
int a[500000];
int d[500000];
unsigned long long count;
void mergeArray(int first, int mid, int last)
{
int i = first, j = mid+1, k =0;
int m = mid, n = last;
while(i<=m && j<=n){
if (a[i] <= a[j]) {
d[k++] = a[i++];
}
else {
d[k++] = a[j++];
count += m-i+1; //记录
}
}
while(i<=m) d[k++] = a[i++];
while(j<=n) d[k++] = a[j++];
for (int i=0;i<k; ++i) a[first+i] = d[i];
}
void mergeSort( int first, int end)
{
if (first < end)
{
int mid = (first + end)/2;
mergeSort(first, mid);
mergeSort(mid+1, end);
mergeArray(first, mid, end);
}
}
int main()
{
int num;
while (true)
{
scanf("%d", &num);
if (num <= 0) break;
for (int i=0; i<num; ++i) scanf("%d", &a[i]);
count = 0;
mergeSort( 0, num-1);//归并排序
printf("%lld\n", count);
}
return 0;
}