poj 2299 Ultra-QuickSort 初级->数据结构->排序-归并排序

来源:互联网 发布:如何利用网络招生 编辑:程序博客网 时间:2024/06/05 19:59

                                              Ultra-QuickSort
Time Limit: 7000MS Memory Limit: 65536K
Total Submissions: 30020 Accepted: 10729

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

Source

Waterloo local 2005.02.05

 

 

 

题意: 求逆序数。思想:利用归并排序求。// /* poj 2299 利用归并排序求逆序数// 3776 KB 1282 ms #include<iostream>#include<cstdio>#include<cstring>using namespace std;int a[500001],b[500001];long long sum,n;void mersort(int L,int R){    if(L>=R) return ;    int mid=L+((R-L)>>1);    mersort(L,mid);    mersort(mid+1,R);    int i=L,k=L,j=mid+1;    while(i<=mid&&j<=R)    {        if(a[i]>a[j])        {            b[k++]=a[j++];            sum+=mid-i+1;        }        else b[k++]=a[i++];    }    while(i<=mid) b[k++]=a[i++];    while(j<=R) b[k++]=a[j++];    for(i=L;i<=R;i++)    a[i]=b[i];}int main(){    int i;    while(cin>>n,n)    {        for(i=1;i<=n;i++)        cin>>a[i];        sum=0;        mersort(1,n);        cout<<sum<<endl;    }    return 0;}// */// /* 速度提升3倍多的求逆序数的归并算法,// 只求结果,不排序,所以速度快。牛逼// 3764 KB 375 ms #include<iostream>#include<cstring>#include<stdio.h>using namespace std;const int N = 500010;int num[N], t[N];long long n;long long merge_sort(int l, int r){    int mid, p, q, i, j, len;    long long ans = 0;    if(l >= r)    return 0;    mid = (l + r) >> 1;    len = r - l + 1;    ans += merge_sort(l, mid);    ans += merge_sort(mid + 1, r);    p = l; q = mid + 1;    j = l;    for(i = 0; i < len; ++i)    if((q>r)|| (num[p]<num[q]&&p<=mid))        t[j++] = num[p++];    else    {        ans += mid - p + 1;        t[j++] = num[q++];    }    for(i = l; i <= r; ++i)num[i] = t[i];    return ans;}int main(){    int i;    while(cin>>n,n){        for(i = 0; i < n; ++i)            scanf("%d", num + i);        printf("%lld\n",merge_sort(0,n-1));        for(i=1;i<=n;i++)        cout<<num[i];    }    return 0;}// */


 

 

原创粉丝点击