public class CounttingInversions { public static int getInversions(int[] a) { return mergeCount(a, 0, a.length - 1); } private static int mergeCount(int[] a, int from, int to) { if (from < to) { int middle = (int) Math.floor((from + to) / 2); int inL = mergeCount(a, from, middle); int inR = mergeCount(a, middle + 1, to); int sum = merge(a, from, middle, to); return inL + inR + sum; } return 0; } private static int merge(int[] array, int from, int middle, int to) { int inversionCount = 0; int[] leftArray = new int[middle - from + 1]; int[] rightArray = new int[to - middle]; for (int i = 0; i < leftArray.length; i++) { leftArray[i] = array[from + i]; } for (int i = 0; i < rightArray.length; i++) { rightArray[i] = array[middle + i + 1]; } int idxL = 0; int idxR = 0; for (int idx = from; idx <= to; idx++) { if (leftArray[idxL] <= rightArray[idxR]) { array[idx] = leftArray[idxL]; idxL++; if (idxL == leftArray.length) { copyRest(array, idx + 1, rightArray, idxR); return inversionCount; } } else { array[idx] = rightArray[idxR]; inversionCount += leftArray.length - idxL; idxR++; if (idxR == rightArray.length) { copyRest(array, idx + 1, leftArray, idxL); return inversionCount; } } } return inversionCount; } private static void copyRest(int[] desArr, int dIdx, int[] oriArr, int oIdx) { for (; oIdx < oriArr.length; oIdx++) { desArr[dIdx] = oriArr[oIdx]; dIdx++; } } public static void main(String[] args) { int[] a = { 4, 3, 2, 1, 0, -1, -2, -3 }; System.out.println(CounttingInversions.getInversions(a)); } }
计算逆序对的算法,算法导论2-4
原创xingzhestar 博主文章分类:算法读书 ©著作权
文章标签 逆序对 算法 java 文章分类 数据结构与算法 人工智能
上一篇:冒泡排序
-
算法篇:逆序对
逆序对的计算
逆序对 算法 数组 冒泡排序 归并排序 -
【算法导论】第2章 算法基础
2.1 插入排序2.1-1 说明INSERTION-SORT在数组A=<31,41,59,26,41,58>上的执行过程。
算法导论 算法 运行时间 数组 插入排序 -
算法的奥秘:常见的六种算法(算法导论笔记2)
算法的奥秘:种类、特性及应用详解(算法导论笔记1)上期总结算法的种类和大致介绍,这一期主要讲常见的六种算法详解以及演示。排
算法 笔记 排序算法 数据结构 java -
算法导论2.1-4
源代码奉上
ios #include C语言 C