逆序数对
来源:互联网 发布:库里2017年总决赛数据 编辑:程序博客网 时间:2024/04/28 06:41
1.思路:分治法
划分问题:分成尽量相等的两半;递归求解:统计i,j分别在左右时的逆序对个数;
合并:统计i在左边,j在右边的逆序对数
-->只需统计对右边的每个j,左边比他大的元素个数F(j)即可
-->所有F(j)之和即为逆序对的个数
-->递归排序按从小到大的顺序排列的过程中,将右边的元素复制到临时数组中时,说明左边剩余元素的个数都比A[j]大,即m-p个,用一个全局变量累加起来即可
栈溢出问题:当n的数量级大于10^6,会发生栈溢出,所以要动态分配内存到堆中
#include<stdio.h>#define MAX 1000000int cnt=0;void merge_sort(int *A,int x,int y,int *T){if(y-x>1){int i,m,p,q;m=x+(y-x)/2;p=x;q=m;i=x;merge_sort(A,x,m,T);merge_sort(A,m,y,T);while(p<m||q<y){if(q>=y || (p<m&&A[p]<=A[q]))T[i++]=A[p++];else{T[i++]=A[q++];cnt+=m-p;}}for(i=x;i<y;i++)A[i]=T[i];}}int main(){int i;int A[8]={13,7,20,2,11,9,12,1};int *T=(int*)malloc(MAX*sizeof(int));merge_sort(A,0,8,T);free(T);for(i=0;i<8;i++)printf("%d ",A[i]);printf("\n%d\n",cnt);return 0;}
栈溢出问题:当n的数量级大于10^6,会发生栈溢出,所以要动态分配内存到堆中
阅读全文
0 0
- 逆序数 & 逆序对
- 逆序数对
- 计算逆序数对
- 逆序数对
- java实现逆序数对
- 【算法】归并排序(可求逆序数或逆序对)
- 求出一列数中的“逆序对”
- 归并排序和求逆序数对
- 树状数组 求解 逆序数对
- 归并排序(求逆序数对)
- FZOJ 2166 inversion 逆序数对 模拟
- HDU 4911 Inversion 求逆序数对
- 归并排序--逆序数对的计算
- 《算法导论》中的逆序数对问题
- 数据结构 归并排序-逆序数对
- 求逆序数对(归并排序)
- 利用归并排序求逆序数对
- hdu4911树状数组求逆序数对
- 关于低位数二进制数转换为高位二进制数的一些心得体会
- SSD 简单的选择重点
- 动态规划之 最优流水调度问题
- 【源码分析】走进EventBus
- Python list 拼接
- 逆序数对
- Httpclient实现POST和GET请求
- leetCode---Rotate Array
- MySQL 创建数据库
- java 数字签名
- codeforces 347 E Number Transformation II
- Java并发中的ConcurrentLinkedQueue源码分析
- 梯度下降法
- 简单的选择排序