算法题12 数组中所有的逆序对
2016-02-02 15:38
218 查看
题目
求一个数组中所有的逆序对数,如数组arr[]={5,2,4,9,8,6,13,14},逆序对有5,2; 5,4; 9,8; 9,6; 8,6; 逆序对数为5
分析
因为数组不是排序的,所以要找一个元素后面所有比它小的数,最直观的想法是依次遍历后续的元素。这样做的时间复杂度为O(n).
除此之外,涉及两个元素间相互比较的计算在数组的排序算法中最为常见了,归并排序在合并的时候可以记录下对比中的逆序对数:
代码
求一个数组中所有的逆序对数,如数组arr[]={5,2,4,9,8,6,13,14},逆序对有5,2; 5,4; 9,8; 9,6; 8,6; 逆序对数为5
分析
因为数组不是排序的,所以要找一个元素后面所有比它小的数,最直观的想法是依次遍历后续的元素。这样做的时间复杂度为O(n).
除此之外,涉及两个元素间相互比较的计算在数组的排序算法中最为常见了,归并排序在合并的时候可以记录下对比中的逆序对数:
代码
int MergeCore(int arr[],int small,int mid,int big,int tmp[]) { int k=0,i=small,j=mid+1; int rever_num=0; while (i<=mid&&j<=big) { if (arr[i]<=arr[j]) { tmp[k++]=arr[i++]; }else { tmp[k++]=arr[j++]; rever_num++; } } while (i<=mid) { tmp[k++]=arr[i++]; } while (j<=mid) { tmp[k++]=arr[j++]; } for (int n=0;n<k;n++) { arr[n+small]=tmp ; } return rever_num; } void MergeSort(int arr[],int s,int e,int tmp[],int& reverse_num) { if (s==e) { return; } int mid=s+(e-s)/2; MergeSort(arr,s,mid,tmp,reverse_num); MergeSort(arr,mid+1,e,tmp,reverse_num); reverse_num+=MergeCore(arr,s,mid,e,tmp); } int ReversePairNum(int arr[],int len) { if (arr==NULL||len<=0) { return -1; } int* tmp=new int[len]; int reverse_num=0; MergeSort(arr,0,len-1,tmp,reverse_num); for (int i=0;i<len;i++) { cout<<arr[i]<<endl; } delete[] tmp; return 0; }
相关文章推荐
- 10个开发中常用的PHP代码样例
- SVN--下载、安装VisualSVN server 服务端和 TortoiseSVN客户端
- nhandled exception in thread started by <function wrapper at 0x035BA3F0>
- php通过字符串调用函数示例
- 特殊回文数
- 关于Calendar和java.util.Date.Date()一些笔记(知识不停累积中)。
- apktool(android app逆向)
- 【LCT】BZOJ 3669: [Noi2014]魔法森林
- ImageView.ScaleType详解(多图)
- iOS UITextField的属性、代理及通知
- Android自定义属性限制
- IPC(Inner Process Comunication)机制基本了解
- LightOJ--1149--Factors and Multiples(二分图好题)
- python中的with与@contextlib.contextmanager
- USB----调用过程和简单解释
- 基于webpack的模块化构建
- Selenium——selenium之利用excel实现参数化
- 字节、字、bit、byte的关系
- UESTC(LCA应用:求两点之间的距离)
- LightOJ--1149--Factors and Multiples(二分图好题)