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

poj 2299 Ultra-QuickSort

2012-06-06 12:40 295 查看
就是求逆序数,用归并排序的过程中记录逆序数,注意结果超出了int的范围,要选用long long或其他类型的变量存储逆序数。

View Code

#include <iostream>
#include <vector>
using namespace std;

long long sum;

void show(vector<int> a)
{
int i;
cout<<"************"<<endl;
for(i=0;i<a.size();i++)
cout<<a[i]<<" ";
cout<<endl;
cout<<a.size()<<endl;
cout<<"************"<<endl;
}

void mergSort(vector<int> & a)
{
int mid=a.size()/2;
vector<int> left;
vector<int> right;
//show(a);

int i,j,k;
if(a.size()>=2)
{
left.resize(mid);
right.resize(a.size()-mid);
for(i=0;i<mid;i++)
left[i]=a[i];
for(j=0;i<a.size();i++,j++)
right[j]=a[i];

mergSort(left);
mergSort(right);

i=j=k=0;
while(i<left.size() && j<right.size())
{
if(left[i]<=right[j])
{
a[k]=left[i];
i++;
}
else
{
sum=sum+left.size()-i;
//cout<<"sum= "<<sum<<endl;

a[k]=right[j];
j++;
}
k++;
}
while(i<left.size())
{
a[k]=left[i];
i++;
k++;
}

while(j<right.size())
{
a[k]=right[j];
j++;
k++;
}
}
}

int main()
{
vector<int> a;
int n;
int i,j;
cin>>n;
while(n!=0)
{
a.clear();
a.resize(n);
for(i=0;i<n;i++)
cin>>a[i];
sum=0;
mergSort(a);
cout<<sum<<endl;
cin>>n;
}

//system("pause\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: