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

poj 2299 Ultra-QuickSort

2017-01-21 16:10 253 查看
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#define MAXN 60
/*
归并排序:假设回溯到某一步,后面的两部分已经排好序(就是说当前需要归并的两个部分都是分别有序的),假设这两个序列为

序列a1:2 3 5 9
序列a2:1 4 6 8

此时我们的目的就是要将a1和a2合并为一个序列。
由于在没排序前a2序列一定全部都是在a1序列之后的,当我们比较a2的1与a1的2时,发现1<2按照归并的思想就会先记录下a2的1,
而这里实际上就是对冒泡排序的优化,冒泡是将a2的1依次与a1的9,5,3,2交换就需要4次,而归并却只有一次就完成了,要怎么去记
录这个4呢,实际上由于1比2小而2后面还有4个数,也就是说那我的结果
就必须要+4,也就是记录a1序列找到第一个比a2某一个大的数,他后面还余下的数的个数就是要交换的次数。
*/
using namespace std;
int N,A[500010],T[500010];
__int64 ans;
void Sort(int x,int y)
{
if(y-x<=1)return;
int mid=x+(y-x)/2;
Sort(x,mid);
Sort(mid,y);
int p=x,q=mid,i=x;
while(p<mid||q<y)//开始排序
{
if(q>=y || (p<mid&&A[p]<=A[q]))T[i++]=A[p++];//如果后面的都排上队了,或者p是这么多数中最小的
else
{
if(p<mid)ans+=(mid-p);//如果p不是第一组数的最后一个
T[i++]=A[q++];
}
}
for(i=x;i<y;i++)
A[i]=T[i];
}
int main()
{
while(~scanf("%d",&N)&&N)
{
memset(A,0,sizeof(A));
memset(T,0,sizeof(T));
for(int i=0;i<N;i++)
scanf("%d",&A[i]);
ans=0;
Sort(0,N);
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: