逆序数
2014-09-27 17:03
134 查看
#问题
对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序。一个排列中所有逆序总数叫做这个排列的逆序数。
如2431中,21,43,41,31是逆序,逆序数是4
#解法
1.枚举--复杂度o(n^2)
2.归并排序--复杂度o(nlogn)
整理自:百度百科http://baike.baidu.com/view/184395.htm?fr=aladdin
对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序。一个排列中所有逆序总数叫做这个排列的逆序数。
如2431中,21,43,41,31是逆序,逆序数是4
#解法
1.枚举--复杂度o(n^2)
2.归并排序--复杂度o(nlogn)
int is1 ,is2 ;// is1为原数组,is2为临时数组,n为个人定义的长度 long mergeSort(int a,int b)// 下标,例如数组int is[5],全部排序的调用为mergeSort(0,4) { if(a<b) { int mid=(a+b)/2; long count=0; count+=mergeSort(a,mid); count+=mergeSort(mid+1,b); count+=merge(a,mid,b); return count; } return 0; } long merge(int low,int mid,int high) { int i=low,j=mid+1,k=low; long count=0; while(i<=mid&&j<=high) if(is1[i]<=is1[j])// 此处为稳定排序的关键,不能用小于 is2[k++]=is1[i++]; else { is2[k++]=is1[j++]; count+=j-k;// 每当后段的数组元素提前时,记录提前的距离 } while(i<=mid) is2[k++]=is1[i++]; while(j<=high) is2[k++]=is1[j++]; for(i=low;i<=high;i++)// 写回原数组 is1[i]=is2[i]; return count; }
整理自:百度百科http://baike.baidu.com/view/184395.htm?fr=aladdin
相关文章推荐
- hdu 3743(树状数组求逆序数)
- cf 61E. Enemy is weak 树状数组求逆序数(WA)
- 排列逆序数和计算
- poj 1007 DNA Sorting 求逆序数
- 逆序数的拆分计算
- hdu 1394 Minimum Inversion Number 逆序数/树状数组
- UESTC -- 841 休生伤杜景死惊开(树状数组 逆序数)
- 多排列的最大逆序数问题
- 树状数组 求逆序数
- 逆序数的几种求法
- hdu 1394 最小逆序数 线段树单点增减,区间求和
- poj(2299)——Ultra-QuickSort(归并排序求逆序数)
- HDU 1043 双向广搜 八数码 康托展开 逆序数
- ZYB's Premutation(有逆序数输出原序列,线段树)
- HDU 1394 Minimum Inversion Number (线段树 单点更新 求逆序数)
- 树状数组求解逆序数
- nyoj 117 求逆序数
- 逆序数的分治算法
- 归并排序求逆序数 NYOJ 117
- 2016 Multi-University Training Contest 4 - 1012(树状数组求逆序数 )