分治法求逆序数的算法实现(Java)
使用分治法求取自然数序列的逆序数,其实现是建立在分治法归并排序的基础上。主要思路:分而治之,mergeSort_lm方法负责“分”(递归),merge_lm方法负责“治”(归并)。对于一个自然数序列A,设其逆序数为a,若将自然数序列划分为B1、B2,那么BI的逆序数+B2的逆序数+B2中元素与B1中元素组成的逆序对个数。可以按照以上模式(mergeSort_lm方法)不断递归划分至最小单元,在从底向上记录逆序数,并归并序列(merge_lm方法)。此时,算法复杂度为nlogn。而暴力双重循环法复杂度为n^2。
/*
* 作者:李泯 UCAS
* 算法作业之分治法求数组逆序数
* 使用分治法求取自然数序列的逆序数,其实现是建立在分治法归并排序的基础上。
* 主要思路:分而治之,mergeSort_lm方法负责“分”(递归),merge_lm方法负责“治”(归并)。
* 对于一个自然数序列A,设其逆序数为a,
* 若将自然数序列划分为B1、B2,那么BI的逆序数+B2的逆序数+B2中元素与B1中元素组成的逆序对个数。
* 可以按照以上模式(mergeSort_lm方法)不断递归划分至最小单元,在从底向上记录逆序数,
* 并归并序列(merge_lm方法)。此时,算法复杂度为nlogn。而暴力双重循环法复杂度为n^2。
*/
public class MergeSortDemo {
//设立全局静态变量:ans:逆序数结果