归并排序思想应用
来源:互联网 发布:mysql text 最大长度 编辑:程序博客网 时间:2024/05/21 04:24
今天刷剑指offer第36题,求逆序数。要求时间复杂度尽可能小。先看下我原来的代码。
#include<algorithm>using namespace std;class Solution {public: int InversePairsCore(vector<int>&data,vector<int>©,long start,long end) { if(start>end)return 0; if(start==end) { copy[start]=data[start]; return 0; } long length=(end-start)/2; long left=InversePairsCore(data,copy,start,start+length); long right=InversePairsCore(data,copy,start+length+1,end); long i=start+length; long j=end; long copyindex=end; long count=0; while(i>=start&&j>=(start+length+1)) { if(data[i]>data[j]) { copy[copyindex--]=data[i--]; count+=j-start-length; } else { copy[copyindex--]=data[j--]; } } for(;i>=start;i--) copy[copyindex--]=data[i]; for(;j>=start+length+1;j--) copy[copyindex--]=data[j]; return (left%1000000007 +right%1000000007 +count%1000000007)%1000000007; } int InversePairs(vector<int> data) { long n=data.size(); if(n<=0)return 0; vector<int>copy(n); for(int i=0;i<n;i++) copy[i]=data[i]; //copy(data.begin(),data.end(),copy.begin()); long count=InversePairsCore(data,copy,0,n-1); return count%1000000007; }};
int InversePairsCore(vector<int>&data,vector<int>©,long start,long end) { if(start>end)return 0; if(start==end) { copy[start]=data[start]; return 0; } long length=(end-start)/2; long left=InversePairsCore(copy,data,start,start+length); long right=InversePairsCore(copy,data,start+length+1,end); long i=start+length; long j=end; long copyindex=end; long count=0; while(i>=start&&j>=(start+length+1)&&j>i) { if(data[i]>data[j]) { copy[copyindex--]=data[i--]; count+=j-start-length; } else { copy[copyindex--]=data[j--]; } } for(;i>=start;i--) copy[copyindex--]=data[i]; for(;j>=start+length+1;j--) copy[copyindex--]=data[j]; return (left%1000000007 +right%1000000007 +count%1000000007)%1000000007; } int InversePairs(vector<int> data) { long n=data.size(); if(n==0)return 0; vector<int>copy(n); for(int i=0;i<n;i++) copy[i]=data[i]; //copy(data.begin(),data.end(),copy.begin()); long count=InversePairsCore(data,copy,0,n-1); return count%1000000007; }
那么问题在于怎样将data数组划分为两个有序的数组?我们假设data已经划分好了这样两个有序的部分,那么现在计算逆序数的过程,就是通过data的两个有序部分逐渐归并为一个有序序列。好了,问题说明白了:
现在data分为两个有序序列,希望对data归并为一个,并放在copy数组中。
那么data这两个有序序列怎么来的呢?
当然是利用copy(一开始等于data)进行归并,这就是上述问题的子问题。递归调用三!
好嘞!这时参数应该是什么?
所以看下我上述代码递归调用处,才发现我根本没理解这个题。
0 0
- 归并排序思想应用
- 分治思想应用:归并排序
- 归并排序的思想以及应用
- 归并排序算法思想
- 归并排序的思想
- 归并排序思想
- 归并排序,分治思想
- 分治思想 归并排序
- 剑指Offer——归并排序思想应用
- 归并排序思想应用之----求数组中的逆序对
- 排序应用--归并排序
- 归并排序(分治思想)
- 分治思想之归并排序
- 分治思想之归并排序
- 归并排序(分治思想)
- 归并排序模版(分治思想)
- 归并排序及其应用
- 归并排序及其应用
- android jarsigner 签名apk简单使用说明
- javascript 作用域
- 使用RMAN异机恢复磁带库的备份文件至文件系统
- Oracle 通过出生日期计算年龄
- Mac系统下Android生成keystore
- 归并排序思想应用
- Java Web学习——问题罗列
- 回文串划分
- 高并发常见的解决方案
- 关于linux中使用vim打开文件出现^M的解决方法
- poj 2777 Count Color 线段树区间更新
- 自定义TextView显示指定行数
- MAC ping IP 地址(ping通/ping不通)
- Tomcat7配置数据源