时间规模为nlogn的数列逆序对数量计算
来源:互联网 发布:sql注入入门 编辑:程序博客网 时间:2024/05/16 15:56
逆序对
假设A[1…n]是一个有n个不同数的数组, 若i<j且A[i]>A[j], 则对偶(i,j)称为A的一个逆序对
设计思路
想要把算法规模控制在nlgn级别, 自然会联系到归并排序算法. 如果依赖归并排序的过程, 那么其中需要统计的则是每层递归执行合并时后序数组中每个元素针对前序数组的逆序和, 也就是每次获取后序数组元素时前序数组剩余元素的个数之和.
算法实现
import java.util.Arrays;/** * Created by buka on 2017/11/7. */public class Itest { static int cnt = 0; public static void main(String[] args) { int[] array = new int[]{3, 41, 52, 26, 38, 57, 9, 49}; mergeSort(array, 0, 7); System.out.println(cnt); System.out.println(Arrays.toString(array)); } static void mergeSort(int[] arr, int p, int r) { int q = (p + r) / 2; if (r > q) { mergeSort(arr, p, q); mergeSort(arr, q + 1, r); merge(arr, p, q, r); } } static void merge(int[] arr, int p, int q, int r) { int n1 = q - p + 1; int n2 = r - q; int L[] = new int[n1]; int R[] = new int[n2]; for (int i = 0; i < n1; i++) { L[i] = arr[p + i]; } for (int j = 0; j < n2; j++) { R[j] = arr[q + j + 1]; } int i = 0; int j = 0; int k = p; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; cnt += n1 - i; } k++; } while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } }}
阅读全文
0 0
- 时间规模为nlogn的数列逆序对数量计算
- 逆序对数的计算
- 对数时间计算斐波那契数列的方法
- 逆序对数{nlogn,归排}
- 求数列的逆序数对数问题
- 计算逆序对数
- 求逆序对数的一种时间复杂度为nlgn的算法
- 分治法 求 逆序对数 的个数 时间复杂度为O(n*logn)
- 求逆序对数的NLogN解法:归并排序、树状数组和线段树
- OI模板·求逆序对数量
- 【Python】以不定条件下兔子总数计算为例-Python中对数量规律问题的思考与延展
- 在nlgn时间内实现逆序对数的计算
- 确定n个元素的任何排序中逆序对数量
- 改进合并排序法以查找元素序列中的逆序对数量,最坏运行时间O( nlog2(n) )
- 【挑战程序设计竞赛】分治法求一个数列逆序对的对数
- hash一下 + 归并排序计算逆序对数
- 归并排序同时计算逆序对数
- 逆序对求解(复杂度为NlogN)
- 文本配置无需编程的网页爬取框架Spider123
- android移植osgearth+依赖库
- 九九乘法表
- leetcode: 20. Valid Parentheses
- NLP10-Gensim源码简析[LsiModel]
- 时间规模为nlogn的数列逆序对数量计算
- 第二章 SQL命令参考-REASSIGN OWNED
- Android SDK在线 国内源
- 6.1(2)
- oracle时间函数
- windows下通过IDE发布job到Hadoop Linux集群
- leetcode: 21. Merge Two Sorted Lists
- Python类的重写和私有变量
- NUMA架构的CPU – 你真的用好了么?