【InversionCount 逆序对数 + MergeSort】
2014-10-10 21:28
375 查看
Definition of Inversion: Let (A[0], A[1] ... A
, n <= 50) be a sequence of n numbers. If i < j and A[i] > A[j], then the pair (i, j) is called inversion of A.
Example:
Count(Inversion({3, 1, 2})) = Count({3, 1}, {3, 2}) = 2
思路,假设用brute force,则O(n^2),借用合并排序里面的合并步骤里的思路
, n <= 50) be a sequence of n numbers. If i < j and A[i] > A[j], then the pair (i, j) is called inversion of A.
Example:
Count(Inversion({3, 1, 2})) = Count({3, 1}, {3, 2}) = 2
思路,假设用brute force,则O(n^2),借用合并排序里面的合并步骤里的思路
import java.util.Arrays; public class MergeSort { static int InversionCount = 0; public static void main(String[] args) { int[] array = {3,1,2,5,4,7,6}; MergeSort(array, 0, array.length-1); System.out.println(InversionCount); System.out.println(Arrays.toString(array)); } public static void MergeSort(int[] array, int lhs, int rhs) { if (lhs < rhs) { int mid = lhs + ((rhs - lhs)>>1); MergeSort(array, lhs, mid); MergeSort(array, mid+1, rhs); Merge(array, lhs, mid, rhs); } } public static void Merge(int[] array, int lhs, int mid, int rhs) { int[] tmp = new int[rhs-lhs+1]; int i = lhs, j = mid+1; int k = 0; while(i <= mid && j <= rhs) { if (array[i] > array[j]) { InversionCount += mid-i+1; tmp[k++] = array[j++]; } else { tmp[k++] = array[i++]; } } while(i <= mid) { tmp[k++] = array[i++]; } while(j <= rhs) { tmp[k++] = array[j++]; } for (i = 0; i < k; i++) { array[i+lhs] = tmp[i]; } tmp = null; } }
相关文章推荐
- 【InversionCount 逆序对数 + MergeSort】
- 利用merge sort寻找逆序对
- 逆序数个数 (Inversion Counting) - Merge and Sort
- 利用merge sort寻找逆序对
- Summary: Merge Sort of Array && 求逆序对
- 用mergesort计算逆序对的算法
- 【算法导论】2-2 二路归并排序(分治)merge-sort 和逆序对的问题
- 用树状数组求逆序对数(poj2299)
- 求逆序对数
- Time Limit Exceeded 求逆序对数。
- 归并(Merge Sort)排序算法
- 合并排序(归并排序 MergeSort)
- (POJ 2299)Ultra-QuickSort 树状数组求逆序对数 + 离散化
- hdu 5273 Dylans loves sequence(区间逆序对数-莫队算法)
- 使用C#详解常用排序算法(三):归并排序(Merge Sort)
- 表与表间的连接方式 Nest loop, Hash join and Sort merge join
- poj 2299 树状数组求逆序对数+离散化
- Merge sort in C++
- 排序算法——归并排序(Merge Sort)
- MapReduce:详解Shuffle(copy,sort,merge)过程