poj 2299

题意:求冒泡的交换次数。

分析:求快排的逆序数。这题直接用冒泡会超时的,虽然时间有7000MS,所以选择时间效率高的归并排序。

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int s[500010];
int left_t[500010];
int right_t[500010];
long long ct;
void merge(int s[],int p,int q,int r)
{
     int i,j,k;
     int n1=q-p+1;
     int n2=r-q;
     for(i=1;i<=n1;i++)
       left_t[i]=s[p+i-1];
     for(i=1;i<=n2;i++)
       right_t[i]=s[q+i];
     left_t[n1+1]=0x7fffffff;
     right_t[n2+1]=0x7fffffff;
     i=j=1;
     for(k=p;k<=r;k++)
     {
       if(left_t[i]<=right_t[j])
       {
         s[k]=left_t[i];
         i++;
       }
       else
       {
         s[k]=right_t[j];
         j++;
         ct+=n1-i+1;
       }
     }
}
         
void mergesort(int s[],int p,int r)
{
    int q;
    if(p<r)
    {
      q=(p+r)/2;
      mergesort(s,p,q);
      mergesort(s,q+1,r);
      merge(s,p,q,r);
    }
}
int main()
{
    int n;
    while(cin>>n,n)
    {
       ct=0;
       for(int i=0;i<n;i++)
          cin>>s[i];
       mergesort(s,0,n-1);
       cout<<ct<<endl;
    }
    return 0;
}


 

 

更多详细信息请查看 java教程网 http://www.itchm.com/forum-59-1.html

猜你喜欢

转载自yiheng.iteye.com/blog/1633946