用mergesort计算逆序对的算法
2011-05-09 15:08
344 查看
static int inversePairs(int[] A,int left,int right){ if(right<left) return 0 ; int mid = (left + right)/2; int inverseCnt = 0; if(mid>left){ inverseCnt += inversePairs(A,left,mid); } if(mid+1<right){ inverseCnt += inversePairs(A,mid+1,right); } //merge the two parts int i1=left; int i2=mid+1; int i3=0;; int[] tmp = new int[right-left+1]; while(i1<=mid && i2<=right){ if(A[i1]>A[i2]){ //inverse found, print out //inverseCnt += mid - i1 + 1; for(int i=i1;i<=mid;i++) { inverseCnt ++; System.out.println(A[i] +" " + A[i2]); } tmp[i3++] = A[i2++]; }else{ tmp[i3++] = A[i1++]; } } if(i1<=mid){ for(int i=i1;i<=mid;i++) tmp[i3++] = A[i]; }else if(i2<=right){ for(int i=i2;i<=right;i++) tmp[i3++] = A[i]; } for(int i=0,j=left+i;i<i3;i++,j++){ A[j] = tmp[i]; } return inverseCnt; }
例如序列(3,0,4,5,1,2)的逆序对有7个:(3,0), (5,1), (5,2), (3,1), (4,1), (3,2), (4,2)。归并算法时间平均复杂度为O(nlogn), 比简单的算法O(n^2)效率高。
相关文章推荐
- 【算法导论】2-2 二路归并排序(分治)merge-sort 和逆序对的问题
- Java实现归并排序(Merge-Sort)算法
- 【InversionCount 逆序对数 + MergeSort】
- 归并排序(merge sort)算法实现
- 简谈算法之:并归排序(Merge Sort)
- merge_sort相比算法导论简易版本实现
- 用Java实现归并排序(Merge-Sort)算法
- 归并排序(merge sort)算法实现
- 算法初级01——认识时间复杂度、对数器、 master公式计算时间复杂度、小和问题和逆序对问题
- 【InversionCount 逆序对数 + MergeSort】
- 实现算法导论第三版中的MergeSort
- 归并排序(merge sort)算法实现
- 归并排序(Merge sort)算法
- 算法上机题目mergesort,priority queue,Quicksort,divide and conquer
- 插入排序(insert_sort)与 并归排序(merge_sort) 算法分析
- 算法-排序-归并排序(MergeSort)分析
- 归并排序(Merge Sort)+计算数列逆序数
- 算法基础3:归并排序(Merge Sort)
- [算法]——归并排序(Merge Sort)
- 逆序数个数 (Inversion Counting) - Merge and Sort