算法_逆序对_归并(java)

简介: 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、题目描述

设A[1…n]是一个包含n个不同数的数组。如果在i<j的情况下,有A[i]>A[j],则称(i,

j)为A中的一个逆序对。 例如,A=(2, 3,8, 6, 1)的逆序对有 21 31 81 86 61 共5个。

a17c0e4b23514b338f04a939f8fae89b.png


二、分析

1.读题 2.分析输入样例 3.思考数据类型 4.考虑时间复杂度 5.写程序

可使用冒泡和归并。冒泡时间复杂度O(n^2)~10 ^4 >10 ^5 舍弃,使用归并解决


2.归并排序模板

f7c3a3cbcd714d5ea3700fcdd81678de.png


代码如下(示例)

class Solution {
  static int count= 0;//逆序对的个数
  void start(int [] a, int left,int right)
  {
    int n = a.length-1;
    int tempArr [] = new int [n];
    mergeSort(a,tempArr,left,right);
  }
  void mergeSort(int a[],int tempArr[], int left, int right)
  {
    if(left < right) 
    { 
    int mid = (left+right) / 2;
    mergeSort(a,tempArr,left,mid);
    mergeSort(a,tempArr,mid+1,right);
    merge_together(a, tempArr,left, right,mid);
    }
  }
   void   merge_together(int a[],int tempArr[] , int left,int right,int mid)
  {
    int l = left;//左指针
    int m = mid+1;//右半边数组指针
    int k = left; //;临时数组第一个元素表示
    while(l<=mid && m<=right)
    {
      if(a[l]<a[m])
      {
        tempArr[k++] = a[l++];
      }else {
        tempArr[k++] = a[m++];
        **count+=(mid-l)+1;**//**此条即可求出逆序对个数,去掉此条,即为归并模板**
      }     
    }
    while(l<=mid) 
    {
      tempArr[k++] = a[left++];
    }
    while(m<=right) 
    {
      tempArr[k++] = a[right++];
    }
     while (left <= right)
        {
            a[left] = tempArr[left];
            left++;
        }
  }
}


3.代码理解

按照题目求逆序对,只需要在合并时添加count= (mid-l)+1即可。

模板分为进入 分组 合并 三部分,

在分组这一块中,用到了递归,递归讲究的是先递后归,即将整体分为左右,对左递,对右递,最后分为单个为一体的有序数组时停止,开始返回上一层运算。

在合并这一块中,对于所求逆序对为啥是count=mid-l+1,可以这样理解,经过分组后,未经合并前左右都是有序的,如果左边第一个数大于右边第一个数,即左边到分割线的数都大于右边第一个数,然后再执行对右边剩余的数放入临时数组。


如有错误,请及时指出,感谢观看!

相关文章
|
3天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
32 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
1天前
|
缓存 算法 Java
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
|
1天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
3天前
|
搜索推荐 算法 Java
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
【5月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
11 0
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
|
3天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
3天前
|
搜索推荐 算法 Java
Java实现的常用八种排序算法
提到数据结构与算法,无法避免的一点就包含排序,熟练的掌握各种排序算法则是一个程序员必备的素质之一,除此之外,排序算法也是当下各大技术公司比较喜欢问的技术点,所以,就这一点JavaBuild整理了常见的8种排序算法
13 0
|
3天前
|
机器学习/深度学习 数据采集 算法
使用 Java 实现机器学习算法
【4月更文挑战第19天】Java在数据驱动时代为机器学习提供支持,具备丰富的数学和数据结构库,适用于实现线性回归、决策树、SVM和随机森林等算法。实现时注意数据预处理、模型选择、评估指标和可视化。利用Java的库和编程能力可构建高效模型,但需按问题需求选择合适技术和优化方法。
|
3天前
|
算法 安全 Java
java代码 实现AES_CMAC 算法测试
该代码实现了一个AES-CMAC算法的简单测试,使用Bouncy Castle作为安全提供者。静态变量K定义了固定密钥。`Aes_Cmac`函数接受密钥和消息,返回AES-CMAC生成的MAC值。在`main`方法中,程序对给定的消息进行AES-CMAC加密,然后模拟接收ECU的加密结果并进行比较。如果两者匹配,输出&quot;验证成功&quot;,否则输出&quot;验证失败&quot;。辅助方法包括将字节转为16进制字符串和将16进制字符串转为字节。
|
3天前
|
搜索推荐 Java
Java排序算法
Java排序算法
20 0
|
3天前
|
搜索推荐 Java
Java基础(快速排序算法)
Java基础(快速排序算法)
25 4