【算法】归并排序(小和问题,逆序对问题)

模块 stm32_基于STM32设计的RFID读卡模块电路方案(原理图+程序) 采用stm32F030F4,用PWM产生125KHZ的方波,经过推挽电路进行功率放大,高频电流进入LC串联谐振电路,345uH和4.7NF的谐振频率正好是125KHZ,这时电容两端电压会到十几伏。当有卡接近线圈时,线圈两端会有曼彻斯特编码的调幅波。通过二极管以及电容的检波和滤波,产生的小信号送入LM358进行放大和整形,变成单片机可以读取的曼彻斯特编码信号。• IO 分配(采用内部晶... 阅读详情

1、 归并排序

归并排序主要由两个步骤组成:划分和合并,每次都划分1/2,需要logn次划分;在合并的过程中,将两个有序的子数组合并成一整个有序的数组所,合并需要遍历所有元素,需要n次操作
时间复杂度为O(nlogn):划分*合并操作
空间复杂度为O(n):用于存储合并时的临时数组长度

1.1 代码实现:

    public static void margeSort(int[] arr, int left, int right) {
        if (left < right) {
            int mid = left + (right - left) / 2;

            // 递归的方式对左右数组进行排序
            margeSort(arr, left, mid);
            margeSort(arr, mid + 1, right);

            // 合并左右两个子数组
            marge(arr, left,right,mid);
        }
    }

    public static void marge(int[] arr, int left, int right, int mid) {
        // 创建临时数组来存放合并后的结果,空间复杂度O(n)
        int[] tmp = new int[right - left + 1];
        int i = 0;
        int p1 = left;
        int p2 = mid + 1;
    
        // 将左右子数组的元素按照从小到大的顺序合并到临时数组中
        // 这里必须小于等于才能保证归并排序的稳定性
        while ( p1 <= mid && p2 <= right) {
            if (arr[p1] <= arr[p2]) {
                tmp[i++] = arr[p1++];
            } else {
                tmp[i++] = arr[p2++];
            }
        }
    
        // 将左子数组中剩余的元素复制到临时数组中
        while (p1 <= mid) {
            tmp[i++] = arr[p1++];
        }

        // 将右子数组中剩余的元素复制到临时数组中
        while (p2 <= right) {
            tmp[i++] = arr[p2++];
        }

        // 将临时数组中的元素复制回原数组的相应位置
        for (int j = 0; j < tmp.length; j++) {
            arr[left + j] = tmp[j];
        }
    }

2、归并排序的变种

2.1 小和问题

问题:求一个数组中每个元素左边比它小的元素的和的总和

    // 小和问题
    public static int smallSum(int[] arr, int left, int right) {
        if (left < right) {
            int mid = left + ((right - left) >> 1);
            return smallSum(arr, left, mid) +
                    smallSum(arr, mid + 1, right) +
                    smallMarge(arr, left, right, mid);
        }
        return 0;
    }
    
    private static int smallMarge(int[] arr, int left, int right, int mid) {
        int[] tmp = new int[right - left + 1];
        int i = 0;
        int p1 = left;
        int p2 = mid + 1;
        int smallSum = 0;
        while (p1 <= mid && p2 <= right) {
            // 这里相等的的先放右边的才能保证小和,这样会导致排序不稳定
            if (arr[p1] < arr[p2]) {
                smallSum += arr[p1] * (right - p2 + 1);
                tmp[i++] = arr[p1++];
            } else {
                tmp[i++] = arr[p2++];
            }
        }
        while (p1 <= mid) {
            tmp[i++] = arr[p1++];
        }
        while (p2 <= right) {
            tmp[i++] = arr[p2++];
        }
        for (int j = 0; j < tmp.length; j++) {
            arr[left + j] = tmp[j];
        }
        return smallSum;
    }

2.2 逆序对问题

逆序对问题是指在一个数组中,如果i<j且a[i]>a[j],则称(a[i], a[j])为一个逆序对

// 逆序对问题
    // 逆序对问题
    public static int reversePairCount(int[] arr, int left, int right) {
        if (left < right) {
            int mid = left + ((right - left) >> 1);
            return reversePairCount(arr, left, mid) +
                    reversePairCount(arr, mid + 1, right) +
                    reversePairCount(arr, left, right, mid);
        }
        return 0;
    }

    public static int reversePairCount(int[] arr, int left, int right, int mid) {
        int[] tmp = new int[right - left + 1];
        int margeCount = 0;
        int i = 0;
        int p1 = left;
        int p2 = mid + 1;
        while (p1 <= mid && p2 <= right) {
            if (arr[p1] < arr[p2]) {
                tmp[i++] = arr[p1++];
            } else {
                // 计算逆序对的数量
                margeCount += mid - p1 + 1;
                tmp[i++] = arr[p2++];
            }
        }
        while (p1 <= mid) {
            tmp[i++] = arr[p1++];
        }
        while (p2 <= right) {
            tmp[i++] = arr[p2++];
        }
        for (int j = 0; j < tmp.length; j++) {
            arr[left + j] = tmp[j];
        }
        return margeCount;
    }
用 MATLAB 实现鼻子和嘴的检测 为了方便起见,这里我们使用了 CascadeObjectDetector 中自带的 haarcascade_frontalface_alt2.xml 文件,该文件包含了多个包含鼻子和嘴的样本图像。其中 bbox 变量表示检测到的所有鼻子和嘴的边界框信息。在图像处理中,鼻子和嘴的检测是十分重要的一项任务。本文将介绍如何使用 MATLAB 实现鼻子和嘴的检测,并提供相应的源代码。然后,我们可以调用之前创建的 detector 对象来进行鼻子和嘴的检测。综上所述,我们可以使用以上代码实现鼻子和嘴的检测。 阅读详情

相关推荐

博途V17 & PLCSIM & FactoryIO 连接教程

PLCSIM V17 和 FactoryIO 连接教程前言一、软件版本二、连接步骤1. 连接PLCSIM2. 博途编程3.连接FactoryIO总结 前言 该文详细讲解了新手入门博途,并通过使用自带PLCSIM和FactoryIO实现连接。 一、软件版本 TIA Portal V17 S7-PLCSIM V17 Factory IO V2.5.1 二、连接步骤 1. 连接PLCSIM 打开PLCSIM 进入项目模式 新建仿真项目 2. 博途编程 将F

soledad_chao的博客 2万+

Java 与排序算法(5):归并排序

归并排序(Merge Sort)是一种基于分治思想的排序算法。它将待排序的数组分成两个长度相等的子数组,然后对这两个子数组分别进行归并排序,最后将两个排好序的子数组合并成一个有序的数组。

暗星涌动 3618

HUMAnN数据库国内备份下载源(转自刘永鑫博士github)

百度云链接 R语言常用包合集 Windows 10版4.0.x:链接:https://pan.baidu.com/s/1JFwLP2SonK1howD5MNgNYg 提取码:l08k Windows 10版3.6.x:链接:https://pan.baidu.com/s/1h-qR2lmlaMgR4M7VbgtAFg 提取码:s5fi 下载后解压至当前目录,可获得3.6/4.0目录,剪切并替换文档 - R - win-library - 3.6/4.0 目录即可 扩增子数据库 宏基因组数据库 HUM.

zlabx的博客 3242

逆序对的两种解法(归并排序和树状数组)及其变种问题的一点思考

逆序对问题: Given an array nums, we call (i, j) an important reverse pair if i&lt; j and nums[i]&gt; nums[j]. You need to return the number of important reverse pairs in the given array. 比如说数组arr[]={3,5...

roufoo的博客 618

Stata实战:用双向固定效应模型分析房价,从数据清洗到结果解读(附完整代码)

本文详细介绍了如何使用Stata实现房价数据的双向固定效应模型分析,从数据清洗到结果解读的全流程。通过具体代码示例,帮助读者掌握面板模型的应用技巧,特别适合经济学和金融学研究者进行房价影响因素分析。

weixin_31528001的博客 277

SDIO_WiFi驱动学习之SDIO架构介绍及源码分析

一、引言 因为WiFi驱动比较复杂,所以WiFi驱动的博客将分为两篇来写。 本篇博客主要介绍Linux下的SDIO架构及源码分析。 二、SDIO WiFi SDIO-Wifi模块是基于SDIO接口的符合wifi无线网络标准的嵌入式模块,内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈,能够实现用户主平台数据通过SDIO口到无线网络之间的转换。SDIO具有传输数据快,兼容SD、MMC接口等特点。 对于SDIO接口的WiFi,首先,它是一个SDIO的卡设备,然后具备了WiFi的功能。所

陈子陌的博客 1万+

小和问题、逆序对问题

小和问题和逆序对问题是可以用归并排序来实现的。 小和问题: 在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。 例子: [1,3,4,2,5] 1左边比1小的数,没有; 3左边比4小的数,1; 4左边比4小的数,1、3; 2左边比2小的数,1; 5左边比5小的数,1、3、4、2; 所以小和为1+1+3+1+1+3+4+2 = 16 主要思...

小哲的博客 1521

个人顶级AI助手OpenClaw(Clawdbot) - 新手快速入门指南

本文详细介绍了个人顶级AI助手OpenClaw(Clawdbot) 的快速入门指南,包括安装部署和使用配置及注意事项

program哲学 5303

算法 - 归并排序 - 小和问题 | 逆序对问题

小和问题 在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和称为小和问题。 input: [2,4,5,1,7,3] 2 左侧比 2 小的数,没有; 4 左侧比 4 小的数,2; 5 左侧比 5 小的数,2,4; 1 左侧比 1 小的数,没有; 7 左侧比 7 小的数,2,4,5,1; 3 左侧比 3 小的数,2,1。 output: 2+2+4+2+4+5+...

ChenBin113 234

【AI智能体】Skills 智能体驱动开发从使用到项目实战详解

Skills 智能体驱动开发从使用到项目实战详解

congge 6601

西南科技大学模拟电子技术实验二(二极管特性测试及其应用电路)预习报告

3、用二极管正向虚拟IV仪测出数据,并记录数据于虚表3和虚表4。1、按照指导书multisim仿真软件上画出三种模型电路图,1、按照指导书multisim仿真软件上画出三种模型电路图,1、按照指导书multisim仿真软件上画出三种模型电路图,表6 二极管三种模型参数测试表(电源电压=1.2V)2、用万用表测出数据,并记录数据于虚表1和虚表2。2、用万用表测出数据,并记录数据于虚表5和虚表6。表5 二极管三种模型参数测试表(电源电压=12V)二极管三种模型参数测试表(电源电压=12V)

Welcome To My6n Blog 4080

算法课笔记-归并排序解决小和问题和逆序对问题

算法课笔记 第一次课 归并排序 指针正着排 package com.LeetCode.day02.demo02; import java.lang.reflect.Array; import java.util.Arrays; public class MergeSort { public static void mergeSort(int[] arr) { if (arr == null || arr.length < 2) { retu

呵呵呵 237

Lasso的原理及其与其他特征选择方法的比较进行阐述,然后讨论Lasso优点、缺点以及应用场景,最后给出了代码实例

在机器学习领域中,特征选择(feature selection)是指在模型训练前对数据集进行分析,选择其中有助于预测目标变量或影响模型性能的特征,去除不相关或冗余的特征,提升模型的泛化能力。而Lasso回归是一种很流行的用于特征选择的方法之一。Lasso回归(又称LASSO,least absolute shrinkage and selection operator)是一种线性模型中的特征选择方法。

AI天才研究院 3051

算法【排序】 | 归并排序【排序、逆序对、小和问题】(附图解、代码)

文章目录简介时间复杂度空间复杂度优缺点:过程图解代码 简介 归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 时间复杂度 总时间复杂度:O(nlogn); 空间复杂度 空间复杂度:O(n+logn); 优缺点: 比较占内存,但效率高且稳定。 过程 图解

weixin_45926547的博客 866

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

分治算法--棋盘覆盖问题+逆序对(归并排序法)

重点:逆序对个数的求解

Jdhhsuhs的博客 576

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

《算法导论》学习:归并排序(哨兵)+ 逆序对问题

void merge(int (&amp;a)[8], int left, int mid, int right) { #define MAX_NUM 0x7fffffff int la[100]; int ra[100]; int nla = mid - left + 1; int nra = right - mid; for (int i = 0; i &lt; nla; ++i) ...

荆轲刺秦王的博客 1213

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

算法学习系列(1)——时间复杂度,冒泡,选择,插入,归并排序,小和问题,逆序对

入门基础11.时间复杂度2.典型排序算法的时间复杂度1) 冒泡排序的时间复杂度O(N2N^{2}N2)2).选择排序的算法复杂度O(N2N^{2}N2)3).插入排序3.对数器(设计评价算法正确与否的工具)4.递归的理解(分治思想)5.递归算法的经典算例5.1 归并排序5.2 笔试常用——小和问题5.2 笔试常用——逆序对问题 1.时间复杂度 常数时间的操作:一个操作如果和数据量没有关系,每次都是...

zzhou——blog 484

(算法)归并排序的延申,求小和问题以及逆序对问题。(超详细保姆级讲解)

求小和问题 简述 有一个数组,我们从左往右遍历,每移动到一位就将它左边的所有比它小的数字全部相加,最后的总和记为小和。下面是一个常规做法过程例子: 那么我们需要的是更快的做法。 分析逻辑 我们仍然可以使用之前的归并排序,将其中merge的部分进行修改。 一下面为例,仍然是将该数组一分为二 图 1 图 2 仍然是准备两个指标,和一个空列表help 看左边的1,3左边p1指向1右边p2指向3,进行比较,1<3,小和加1,把1存入help列表,指标p1右移出界(左边没有数字了)...

qq_48860282的博客 793

算法学习——归并排序及其衍生问题(小和问题、逆序对问题、衍生问题3)

算法学习——归并排序归并排序的时间复杂度归并排序的递归形式实现具体实现代码小和问题具体实现代码逆序对问题具体实现代码归并排序衍生问题3具体实现代码具体的代码都丢在自己的svn仓库了,需要的可以发邮件给我:799954772@qq.com 归并排序的时间复杂度 O(N*logN),要遍历N个数,遍历logN次,次数可以通过非递归形式的归并排序得出 归并排序的时间复杂度为 O(N*logN) O(N*logN)比 O(N^2)的好处:不浪费比较行为 O(N^2)浪费比较行为,例如选择排序,遍历

卑微小韩 443

从信息学奥赛到算法实战:归并排序巧解逆序对问题

本文详细解析了如何利用归并排序高效解决逆序对问题,从暴力解法的不足到分治思想的优化,再到代码实现的关键细节和实战演练。通过洛谷P1908的实例,展示了算法在竞赛中的实际应用,并分享了调试技巧和算法思维的延伸应用。

weixin_29275257的博客 200

牛客网_算法初级班_Lesson1_Part II_递归求数组最大值_归并排序_小和问题_逆序对问题_python语言描述

一、递归求数组最大值 递归行为就是说自己调用自己,但是它必须有一个离开条件,不然会陷入死循环。 递归的实质就是计算机自己进行压栈,执行到递归的地方则把父行为压进栈中,进而执行子行为;依次反复,直到执行到离开条件为止。 code: def getMax(array, L, R): ''' 利用递归行为:自己调用自己;求出一个数组中的最大值: 右边取得最大值,右边取得最...

禾白小三撇同学- 298

算法 | 归并排序 | 小和、逆序对问题

在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个给定数组的小和。例子:数组为:[1,3,4,2,5]1左边比1小的数:没有3左边比3小的数:14左边比4小的数:1,32左边比2小的数:15左边比5小的数:1,3,4,2所以小和为1+(1+3)+1+(1+3+4+2)=16:找每一个数右边比当前数大的个数,(个数 * 当前数) 的累加和就是结果。

蘑菇蘑菇不会开花的专栏 471

算法笔记08 - 归并排序 | 分治 | 小和问题 | 逆序对问题 | BiggerThanTwice问题 | 分治做题总结

归并排序是一种稳定高效的排序算法,采用分治策略将数组不断二分直到单元素有序,再逐步合并有序子数组。其核心在于合并过程,通过双指针依次比较左右部分元素,将较小值存入辅助数组。该算法时间复杂度稳定为O(nlogn),不受数据初始状态影响。文章详细介绍了递归实现(划分左右区间分别排序后合并)和迭代实现(通过步长控制逐步合并子数组)两种方法,并提供了完整的Java代码示例,展示了从单元素开始逐步合并直至整个数组有序的过程。

zyw4259的博客 1000

【算法100天 | 13】归并排序引出的系列问题(小和、逆序对、特定逆序对)

归并排序引出的系列问题(小和、逆序对、特定逆序对)

健身变秃,coding变强 440

经典算法问题: 逆序对(用归并排序的思想解决)

问题:给定一个长度为n的排列,求其逆序对数 输入格式:        输入一个数组 输出格式:        输出逆序对总数    样例输入:         [1,2,4,3] 样例输出:           1 数据规模:           n<=100000 解题思路:     首先,在解决这个问题之前,先了解一下什么叫逆序对 逆序对:数学术语,设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。 如果存在正整数 i, j 使得 1 ≤ i &lt

Ctra_aaa的博客 3227

数据结构与算法(Java) 6:归并排序应用[逆序对问题]

逆序对问题 在一个数组中,左边的数如果比右边的数大,则折两个数构成一个逆序对,请打印所有逆序对。 类似于小和问题,此题只要将归并排序转换为由大至小排序,找出L部分大于R部分的数即可。 package section1; import java.util.Arrays; public class ReversePair { public static int reversePair...

Dorothy_Xue 342
上一篇: 【算法】简单排序(选择,冒泡,插入)
下一篇: 【算法】快速排序
尹正义
博客等级 码龄6年 134粉丝 22原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值