poj 2299
题意:求冒泡的交换次数。
分析:求快排的逆序数。这题直接用冒泡会超时的,虽然时间有7000MS,所以选择时间效率高的归并排序。
代码:
[cpp]
<span style="font-family:KaiTi_GB2312;font-size:18px;">#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)
{ www.zzzyk.com
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;
}
</span>
作者:hellobabygogo3
补充:软件开发 , C++ ,