POJ 2299 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
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

就是求逆序对
详情看前面讲解如何求逆序对,(分类:排序-》归并排序与逆序对)

CODE

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn =  500100;
long long cnt;
int A[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;//p为合并时左边下标,q为右边下标
        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()
{
    int n;
    while(cin >> n && n)
    {
        for(int i = 0; i < n; i++)
        cin >> A[i];
    cnt = 0;
    merge_sort(A,0,n,T);
    cout << cnt << endl;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/AC__GO/article/details/81240278