热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

获取数组中逆序对的对数

packageclass04;importjava.util.Arrays;***获取数组中逆序对的对数**在一个数组中,*任何一个前面的数a,和任何一个后面的数b,*如果(

package class04;
import java.util.Arrays;
/**
* 获取数组中逆序对的对数
*


* 在一个数组中,
* 任何一个前面的数a,和任何一个后面的数b,
* 如果(a,b)是降序的,就称为逆序对。
* 返回数组中所有的逆序对的对数。
*/
public class Code03_reversePairNumber {
public static int reversePairNumber(int[] arr) {
if (arr == null || arr.length <2) {
return 0;
}
return process(arr, 0, arr.length - 1);
}
private static int process(int[] arr, int L, int R) {
if (L == R) {
return 0;
}
int M = L + ((R - L) >> 1);
return process(arr, L, M) + process(arr, M + 1, R) + merge(arr, L, M, R);
}
private static int merge(int[] arr, int L, int M, int R) {
int[] help = new int[R - L + 1];
int ans = 0;//用于记录逆序对的对数
int p1 = M;//定义p1先在左组的最右位置
int p2 = R;//定义p2先在右组的最右位置
int i = help.length - 1;//辅助数组help,从后往前逆序填值。
while (p1 >= L && p2 >= M + 1) {
//如果arr[p1]大于arr[p2],那么右组中p2(不含)左侧的所有数,都是大于arr[p1]的,给ans累加上这个个数。
ans += arr[p1] > arr[p2] ? p2 - (M + 1) + 1 : 0;
//如果左组中的arr[p1],大于右组中的arr[p2],就给help[i]赋值arr[p1],p1--,i--。
//如果左组中的arr[p1],小于等于右组中的arr[p2],就给help[i]赋值arr[p2],p2--,i--。
//注意,如果是等于,一定是给help[i]赋值右组的arr[p2],而不是左组的arr[p1]。否则,对于左组的arr[p1],我们不知道右组中一共有几个数是小于arr[p1]的。
help[i--] = arr[p1] > arr[p2] ? arr[p1--] : arr[p2--];
}
while (p1 >= L) {//只要p1大于等于左组的0位置
help[i--] = arr[p1--];//就将arr[p1]赋值给help[i],p1--,i--。
}
while (p2 >= M + 1) {//只要p2大于等于右组的0位置
help[i--] = arr[p2--];//就将arr[p2]赋值给help[i],p2--,i--。
}
for (i = 0; i //将辅助数组help中的值,全部倒给原数组arr。仅仅是当前一个小组。
arr[L + i] = help[i];
}
return ans;
}
//获取逆序对的对数,用于测试。
public static int reversePairNumberForTest(int[] arr) {
int ans = 0;
for (int i = 0; i ) {
for (int j = 0; j ) {
if (arr[j] > arr[i]) {//数组中,当任意一个数大于它左侧的任意一个数时,ans就累加一。
ans++;
}
}
}
return ans;
}
public static int[] generatorRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) (Math.random() * maxSize) + 2];
for (int i = 0; i ) {
arr[i] = (int) (Math.random() * maxValue);
}
return arr;
}
public static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i ) {
res[i] = arr[i];
}
return res;
}
public static void main(String[] args) {
int maxSize = 100;
int maxValue = 100;
int testTimes = 100000;
System.out.println(
"test start!");
for (int i = 0; i ) {
int[] arr0 = generatorRandomArray(maxSize, maxValue);
int[] arr1 = copyArray(arr0);
int[] arr2 = copyArray(arr0);
int num1 = reversePairNumber(arr1);
int num2 = reversePairNumberForTest(arr2);
if (num1 != num2) {
System.out.println(
"oops!");
System.out.println(
"arr0 = " + Arrays.toString(arr0));
System.out.println(
"num1 = " + num1);
System.out.println(
"num2 = " + num2);
break;
}
}
System.out.println(
"test end!");
}
}

 



推荐阅读
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 本文介绍如何在Java中实现一个罗马数字计算器,重点在于如何通过循环和字符验证确保用户输入合法。我们将探讨创建一个方法来检查字符串中的非法字符,并使用循环不断提示用户输入,直到输入符合要求。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • Logback使用小结
    1一定要使用slf4j的jar包,不要使用apachecommons的jar。否则滚动生成文件不生效,不滚动的时候却生效~~importorg.slf ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 本文详细解析了Java中throw和throws的关键区别,同时涵盖了JDK的定义、Java虚拟机的关键约定、Java的跨平台性、自动垃圾回收机制、源文件结构、包的概念及作用等多个核心知识点,旨在帮助学生更好地准备Java期末考试。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
  • 本文介绍了如何在iOS应用中自定义导航栏按钮,包括使用普通按钮和图片生成导航条专用按钮的方法。同时,探讨了在不同版本的iOS系统中实现多按钮布局的技术方案。 ... [详细]
author-avatar
你永远不冫会懂我的心O_751
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有