归并排序-逆序对-hdu3743
来源:互联网 发布:gcf软件下载 编辑:程序博客网 时间:2024/06/01 23:28
归并排序
方法:分治法
分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。
解决:使用归并排序递归的排序两个子序列。
合并:合并两个已排序的子序列以产生已排序的答案。
时间复杂度:O(n
伪代码:
MERGE(A,p,q,r) n1=q-p+1 n2=r-q let L[1...n1+1] and R[1...n2+1] be new arrays for i = 1 to n1 L[i] = A[p+i-1] for j = 1 to n2 R[j] = A[q+j] L[n1+1] = 无穷大 R[n2+1] = 无穷大 i = 1 j = 1 for k = p to r if L[i]<=R[j] A[k]=L[i] i++ else A[k]=R[j] j++MERGE_SORT(A,p,r) if p < r q = (p+r)/2 MERGE_SORT(A,p,q) MERGE_SORT(A,q+1,r) MERGE(A,p,q,r)
以hdu3743为例:
我看网上很多题解都是树状数组,其实逆序对也可以,只不过时间复杂度高些。树状数组得时间复杂度是O(
题意:实际上就是求逆序对得个数。(有多少个逆序对就会交换多少次)
题解:这里ans加的是交换的次数。
#include <iostream>#include <algorithm>#include <cstring>#include <cstdlib>#include <typeinfo>#include <vector>#include <iomanip>#include <map>#include <queue>#include <set>#include <stack>using namespace std;long long ans,sz[1000005];void MERGE(int left,int mid,int right){ int n1=mid-left+1,n2=right-mid; int L[n1+1],R[n2+1]; for(int i=0;i<n1;i++) L[i]=sz[left+i]; for(int i=0;i<n2;i++) R[i]=sz[mid+i+1]; L[n1]=1000000000; R[n2]=1000000000; int i=0,j=0; for(int k=left;k<=right;k++) { if(L[i]<=R[j]) { sz[k]=L[i]; i++; } else { sz[k]=R[j]; j++; ans+=(n1-i); } }}void merge_sort(int left,int right){ if(left<right) { int mid=(left+right)/2; merge_sort(left,mid); merge_sort(mid+1,right); MERGE(left,mid,right); }}int main(){ int n; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) scanf("%d",&sz[i]); ans=0; merge_sort(0,n-1); printf("%lld\n",ans); } return 0;}
如果还不是很清楚,可以看看这个动态排序过程,有助于理解。
https://visualgo.net/
1 0
- 归并排序-逆序对-hdu3743
- 逆序对 归并排序
- 归并排序 & 逆序对
- 归并排序--逆序对
- 归并排序&归并排序求逆序对
- 归并排序 例题即模版 XMU1328 hdu3743
- 归并排序求逆序对
- 【归并排序】【逆序对】序列
- 归并排序与逆序对
- 归并排序求逆序对
- 归并排序求逆序对~~~
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序之逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- Failure delivering result ResultInfo
- 一道经典JS题(关于this)
- NYOJ—一笔画问题(欧拉回路)
- 流媒体-RTSP
- Anne's PHP+MYSQL first step
- 归并排序-逆序对-hdu3743
- Linux driver oops异常的处理
- 统计学习方法(一)——统计学习方法概论
- UVA
- 扩展iServer数据服务REST资源实现点靠近线、打断线(二)
- android studio 禁止运行前的检测更新
- LSH算法学习笔记
- ERROR 1049 (42000): Unknown database 'root'
- NetWork——关于TCP协议的三次握手和四次挥手