Ultra-QuickSort
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
Ultra-QuickSort produces the output 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 Source |
将一组数升序排列,每次只能交换两个相邻的数,求最小交换次数。
是的,求逆序对数即可
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int MAXN = 500000 + 10;
long long cnt;
int n;
int num[MAXN], t[MAXN];
void merge_sort(int* A, int x, int y, int* T)
{
if (y - x > 1)
{
int m = x + (y - x) / 2; ///划分
int p = x, q = m, i = x;
merge_sort(A, x, m, T); ///递归求解
merge_sort(A, m, y, T); ///递归求解
while (p < m || q < y)
{
///从左半数组复制到临时空间
if (q >= y || (p < m && A[p] <= A[q])) T[i++] = A[p++];
else
{
T[i++] = A[q++]; ///从左半数组复制到临时空间
cnt += m - p; ///累加
}
}
for ( i = x; i < y; i++) A[i] = T[i]; ///从辅助空间复制回A数组
}
}
int main()
{
while (~scanf("%d", &n), n)
{
for (int i = 0; i < n; i++) scanf("%d", &num[i]);
cnt = 0;
merge_sort(num, 0, n, t);
printf("%I64d\n", cnt);
}
return 0;
}