逆序对的查找
来源:互联网 发布:铁路造价软件培训 编辑:程序博客网 时间:2024/06/03 12:30
算法导论在第二章的最后2-4小题中提到了查找逆序对的问题。
其实我认为,查找逆序对其实就是排序的过程,比如3,2,1
插入排序的过程就是3,2-3,1-2-3.需要3次交换位置,这正好也是逆序对的数目(这里针对的只能是数组,如果是链表则不是这样)。
所以他要求在nLgn的时间计算出逆序对的数量,正好可以采用归并排序。
#include<stdio.h>#include<stdlib.h>int merge(int *A, int left ,int mid, int right){ int i; int j; int Tl[8]; int Tr[8]; int lnum; int rnum; int inversion = 0; lnum = mid-left+1; rnum = right - mid; //assinment for(i =0;i<lnum;i++) Tl[i]=A[left+i]; for(j =0;j<rnum;j++) Tr[j] = A[mid+j+1]; i = 0; j =0; while(i<(lnum)&&j<(rnum)) { if(Tl[i]<Tr[j]) A[left++] = Tl[i++]; else { A[left++] = Tr[j++]; //for (4,5)(2,3) //Tl[0]>Tr[0],so inversion + lnum; //then Tl[1]>Tr[0] ,also +lnum inversion+=lnum -i; } } while(i<(lnum)) { A[left++] = Tl[i++]; } while(j<(rnum)) { A[left++] = Tr[j++]; } return inversion;}int merge_sort(int *A,int left,int right) { int mid; int inversion = 0; if(left<right) { mid = (left+right)/2; //count steps inversion += merge_sort(A,left,mid); inversion += merge_sort(A,mid+1,right); inversion += merge(A,left,mid,right); } return inversion; }int main(){ int A[8] = {5,4,3,2,1,0,7,6}; int sum; //merge sort sum = merge_sort(A,0,7);}
0 0
- 逆序对的查找
- 归并排序查找逆序对
- 查找数组中的逆序对
- java实现的递归方法逆序对查找
- 排序:查找数组中逆序对的个数
- 利用分治算法,来完成逆序对的查找
- 逆序对的个数
- 逆序对的求解
- 逆序对的dp
- 逆序对的个数
- 对单词的逆序
- 使用归并思想查找数组中的逆序对的数量——Java实现
- 计算逆序对的个数
- 逆序对的nlgn算法
- 逆序对的递归求法
- 找到数组的逆序对
- 统计数组的逆序对
- 求数组的逆序对
- linux下pwd命令的编写
- GDI与GDI+在RECT结构的区别
- 创建型模式-FactoryMethod ( 工厂方法 )
- caffe中增加自己的layer
- 'JAVAC' 不是内部或外部命令
- 逆序对的查找
- 写JAVA程序实现CPU使用率保持在50%(附加画正弦函数)
- Ubuntu samba安装服务器与图形管理界面
- 数据挖掘 学习路线(转)
- Java POI导出excel
- 创建型模式-Singleton ( 单态模式 )
- Android关于弹出软键盘,页面被顶上去的问题。
- iOS战记
- 机器学习的最佳入门学习资源(转)