算法题12 数组中所有的逆序对
来源:互联网 发布:为什么江老是被黑 知乎 编辑:程序博客网 时间:2024/06/15 13:52
题目
求一个数组中所有的逆序对数,如数组arr[]={5,2,4,9,8,6,13,14},逆序对有5,2; 5,4; 9,8; 9,6; 8,6; 逆序对数为5
分析
因为数组不是排序的,所以要找一个元素后面所有比它小的数,最直观的想法是依次遍历后续的元素。这样做的时间复杂度为O(n).
除此之外,涉及两个元素间相互比较的计算在数组的排序算法中最为常见了,归并排序在合并的时候可以记录下对比中的逆序对数:
代码
1 int MergeCore(int arr[],int small,int mid,int big,int tmp[]) 2 { 3 int k=0,i=small,j=mid+1; 4 int rever_num=0; 5 while (i<=mid&&j<=big) 6 { 7 if (arr[i]<=arr[j]) 8 { 9 tmp[k++]=arr[i++];10 }else11 {12 tmp[k++]=arr[j++];13 rever_num++;14 }15 }16 17 while (i<=mid)18 {19 tmp[k++]=arr[i++];20 }21 while (j<=mid)22 {23 tmp[k++]=arr[j++];24 }25 26 for (int n=0;n<k;n++)27 {28 arr[n+small]=tmp[n];29 }30 31 return rever_num;32 }33 34 void MergeSort(int arr[],int s,int e,int tmp[],int& reverse_num)35 {36 if (s==e)37 {38 return;39 }40 int mid=s+(e-s)/2;41 MergeSort(arr,s,mid,tmp,reverse_num);42 MergeSort(arr,mid+1,e,tmp,reverse_num);43 reverse_num+=MergeCore(arr,s,mid,e,tmp);44 45 }46 47 int ReversePairNum(int arr[],int len)48 {49 if (arr==NULL||len<=0)50 {51 return -1;52 }53 54 int* tmp=new int[len];55 int reverse_num=0;56 MergeSort(arr,0,len-1,tmp,reverse_num);57 58 for (int i=0;i<len;i++)59 {60 cout<<arr[i]<<endl;61 }62 63 delete[] tmp;64 return 0;65 }
0 0
- 算法题12 数组中所有的逆序对
- 算法题/求数组的逆序对
- 【算法】数组中的逆序对的总数
- 数组中逆序对
- 数组中逆序对
- 求解数组中逆序对的对数
- 求数组中逆序对的个数
- 求数组中逆序对的个数
- 数组中出现的逆序对
- 逆序对的两种算法【树状数组 / 归并排序】
- 对“求数组中所有和为某固定数的所有数对”的算法的简单思考
- 找到数组的逆序对
- 统计数组的逆序对
- 求数组的逆序对
- 排序:查找数组中逆序对的个数
- 剑指OFFER_求数组中逆序对的个数
- 算法题目---数组中的逆序对
- 逆序对的nlgn算法
- 死锁、活锁、优先级翻转
- 算法题10 最长等差序列问题
- Android 中 onTouch 和OnClick 冲突的处理(onTouchEvent返回true时与onclick冲突)
- 算法题11 字符串的所有对称子串
- CodeForces 622C Not Equal on a Segment
- 算法题12 数组中所有的逆序对
- Android设计模式系列(2)--SDK源码之观察者模式
- 算法题13 排序算法(更新快排)
- iOS单元测试
- 算法题14 最低公共祖先
- 数据仓库专题20-案例篇:电商领域数据主题域模型设计v0.1(改进意见征集中)
- android 反编译
- android触摸事件传递
- 在 Web 项目中应用 Apache Shiro