【InversionCount 逆序对数 + MergeSort】
2014-04-26 22:02
387 查看
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】
- Summary: Merge Sort of Array && 求逆序对
- 用mergesort计算逆序对的算法
- 【算法导论】2-2 二路归并排序(分治)merge-sort 和逆序对的问题
- 逆序数个数 (Inversion Counting) - Merge and Sort
- 利用merge sort寻找逆序对
- 利用merge sort寻找逆序对
- Ultra-QuickSort 求最小交换次数即求逆序对数 树状数组+离散化
- 求逆序对数
- Merge Sort
- 归并排序算法MergeSort in C#
- 杭电4911 Inversion(找最小逆序对数)
- HDU 1394 Minimum Inversion Number (求逆序对数)
- mapreduce里的shuffle 里的 sort merge 和combine
- 分治算法之求逆序对数
- Java 归并排序(MergeSort)
- Hive 基础之:分区、桶、Sort Merge Bucket Join
- Collections.sort in JDK6:MergeSort
- 归并排序(merge_sort)的C语言实现
- 算法导论 第二章MergeSort