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 <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int inf = 1000000000;
long long cnt;
void dell(int *a, int h, int mid, int t)
{
int L = mid - h + 1;
int R = t - mid;
int *left = new int[L+2];
int *right = new int[R+2];
for( int i = 1; i <= L; i++)
left[i] = a[h+i-1];
left[L+1] = inf;
for( int i = 1; i <= R; i++ )
right[i] = a[mid+i];
right[R+1] = inf;
int k = h;
int i, j;
i = j = 1;
while(k<=t)
{
if( left[i]<=right[j] )
a[k++] = left[i++];
else
{
a[k++] = right[j++];
cnt += L - i + 1;
}
}
free(left);
free(right); //用完之后要释放 否则会MLE
return;
}
void msort(int *a, int h, int t) //归并排序
{
if( h<t )
{
int mid = (h+t)/2;
msort(a,h,mid);
msort(a,mid+1,t);
dell(a,h,mid,t);
}
return;
}
int main()
{
int n;
while(cin>>n&&n)
{
int *a;
a = new int[n+1];
for( int i = 1; i <= n; i++ )
cin>>a[i];
cnt = 0;
msort(a,1,n);
cout<<cnt<<endl;
free(a);
}
return 0;
}