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; }
相关文章推荐
- poj 2299 Ultra-QuickSort(树状数组)
- POJ2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- POJ 2299 Ultra-QuickSort
- POJ 2299 Ultra-QuickSort
- POJ 2299 Ultra-QuickSort
- poj 2299 Ultra-QuickSort(归并排序)||(树状数组+离散化)
- POJ 2299-Ultra-QuickSort (树状数组+离散化)
- poj 2299 Ultra-QuickSort
- POJ 2299 Ultra-QuickSort
- POJ 2299 - Ultra-QuickSort
- POJ 2299 Ultra-QuickSort
- POJ 2299 Ultra-QuickSort (归并排序求逆序对数)
- POJ 刷题系列:2299. Ultra-QuickSort
- POJ2299 [Ultra-QuickSort] 值域树状数组
- POJ2299 Ultra-QuickSort(树状数组求逆序数)
- poj 2299 Ultra-QuickSort(树状数组求逆序数)
- POJ 2299 Ultra-QuickSort
- POJ2299-Ultra-QuickSort(树状数组+离散化)
- POJ 2299 Ultra-QuickSort(树状数组)
- POJ - 2299 Ultra-QuickSort —— 逆序对