您的位置:首页 > 产品设计 > UI/UE

poj2299—Ultra-QuickSort

2014-08-03 00:47 274 查看
Ultra-QuickSort

Time Limit:7000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u

Submit

Status

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 <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef __int64 LL ;
LL a[500005],vis[500005];
LL ans;
void sort2(LL a[], int begin, int mid, int end)
{
int i = begin;
int j = mid + 1;
int k = begin;
while (i <= mid && j <= end)
{
if(a[i] <= a[j])
{
vis[k++] = a[i++];
}
else
{
vis[k++] = a[j++];
ans += mid - i +1;
}
}
while(i <= mid)
{
vis[k++] = a[i++];
}
while (j <= end)
{
vis[k++] = a[j++];
}
for(i = begin; i <= end; i++)
{
a[i] = vis[i];
}
}
void sort1(LL a[],int begin, int end)
{
if(begin != end)
{
int mid = (begin + end)/2;
sort1(a,begin,mid);
sort1(a,mid+1,end);
sort2(a,begin, mid, end);
}
}
int main()
{
int n,i;
while (scanf("%d",&n)&&n)
{
ans = 0;
for(i = 0; i < n;i++)
{
scanf("%d",&a[i]);
}
sort1(a,0,n-1);
printf("%I64d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: