分治法求逆序数
来源:互联网 发布:mac桌面壁纸位置 编辑:程序博客网 时间:2024/05/17 03:53
其实分治法求逆序数相当于在归并排序的过程中加上相应的逆序数的数目就行。
假设数组A被划分成前半部分(A[left]->A[mid]),后半部分(A[mid+1],A[right])
假设前半部分与后半部分各自都是从小到大排好序的,若A[left]<A[mid+1]那么由A[mid+1]这个数与数组前半部分造成的逆序数目是mid-left+1,这个数在接下来的逆序数中不用再考虑,反之类同
#include<iostream>using namespace std;int merge(int *A,int left,int mid,int right){int *temp=new int[right-left+1];int num=0;int i=left;int j=mid+1;int k;int index=0;for(;i<=mid&&j<=right;){if(A[i]>A[j]){num+=mid-i+1;temp[index]=A[j];j++;}else{temp[index]=A[i];i++;}index++;}//i=mid的时候,A[i]位置的数还未填充到数组temp中//因此判断条件包含等于号if(i<=mid)for(;i<=mid;i++){temp[index]=A[i];index++;}if(j<=right)for(;j<right;j++){temp[index]=A[j];index++;}for(k=0;k<right-left+1;k++)A[left+k]=temp[k];delete []temp;return num;}int inversion(int *A,int left,int right){if(left>=right)return 0;int mid=(left+right)/2;int num1=inversion(A,left,mid);int num2=inversion(A,mid+1,right);return num1+num2+merge(A,left,mid,right);}int main(){int A[5]={9,8,7,6,5};cout<<inversion(A,0,4);int i;cin>>i;}
- 分治法 求 逆序数
- 分治法求逆序数
- 分治法求逆序数
- 分治求逆序数
- 分治法的应用-求逆序数
- 【HDU4911】分治求逆序数
- 分治法 逆序数
- 分治法求整数序列的逆序数
- 树状数组与分治法求逆序数
- POJ 2299 Ultra-QuickSort 分治法求逆序数
- 求逆序数的分治算法
- 求逆序数之分治排序
- 求逆序数的分治算法
- 分治算法 求数组逆序数
- 分治之求排列的逆序数
- 分治法求逆序对数
- 分治法求逆序对
- 分治法求解逆序数
- c#根据配置文件反射
- error: *** No iconv() implementation found in C library & libiconv 交叉编译 失败编译
- 设计模式六大原则(3):依赖倒置原则
- seajs 文档
- Perl中的数组操作
- 分治法求逆序数
- 初识 SeaJS
- 密码管理工具:keepass
- 将函数的实际参数转换成数组
- 让我膜拜的SQL句子
- Android程序适应各种屏幕
- Ubuntu 常用软件安装命令
- atomic与nonatomic
- 基于 MVC4 Route 注入实现