Ultra-QuickSort(POJ 2299)
2015-08-04 09:29
429 查看
此题链接单击这里
=================这是用归并排序解的第一道题,解了一天。大部分时间用在理解归并的思想,在没有弄清题意和做法都不敢写。以前做题总是求结果,而并没有总结过程。今天就有了新的想法,扎扎实实打基础,尽可能用算法和数据结构解题。
题意:
输入一个序列,求序列按升序排列最少需要对数交换多少次(逆序对)。
思路:
用归并排序,记录当i>j并且a[i]>a[j]的个数。
如:2 3 6 7 1 4 5 8
上序列mid前后子序列已排好序,当2>1时,1前面有4个数,所以要交换4次。当6>5时,1和4已经取出,5到之间只有1个7,所以交换2次。
#include <iostream> #include <vector> #include <cstring> #include <cstdio> using namespace std; long long a[500005]; //注意long long,long是不够的。 long long b[500005]; long long sum; void funt(int x,int y) { if(y-x>1){ int mid=x+(y-x)/2; funt(x,mid); funt(mid,y); int p=x,q=mid,k=x; while(p<mid||q<y) { if(q>=y||(p<mid&&a[p]<=a[q])) b[k++]=a[p++]; else { b[k++]=a[q++]; sum+=mid-p; } } for(int i=x;i<y;i++) a[i]=b[i]; } } int main() { int n; while(scanf("%d",&n)==1&&n) { sum=0; memset(b,0,sizeof(b)); for(int i=0;i<n;i++) scanf("%lld",&a[i]); funt(0,n); printf("%lld\n",sum); } }
有问题联系企鹅791267032
邮箱地址….wutanrong@Hotmail.com
相关文章推荐
- UIEvent
- POJ 3907 Build Your Home
- JS 模块化使用 [Require JS]
- [leetcode]Unique Paths(C)
- Error:svn: E175002: connection refused by the server svn: E175002: OPTIONS request failed on '
- Unique Binary Search Trees II
- 25.UITouch
- HDOJ Fruit 2152【母函数】
- Havok_2014-1-0_Pc_Xs_User_Guide(2.5.3-保存接触点)
- Havok_2014-1-0_Pc_Xs_User_Guide(1.1.2-基础系统)
- IOS开发基础之UIImage
- UE4信息交互-蓝图类与关卡对象的信息交互
- UISlider
- UISegmentControl
- SPOJ QTREE4 Query on a tree IV (边分治 + 堆)
- POJ_1986_Distance Queries(LCA+tarjan)
- iOS开发——UI进阶篇(十四)modal
- SPOJ PTO7J Query on a tree III(dfs序+主席树)
- SPOJ QTREE2 Query on a tree II (倍增LCA)
- 想要App做得美,这些UI/UX设计趋势你要知道啊