首页 > 编程语言 >归并排序-使用归并排序实现小和问题-java实现

归并排序-使用归并排序实现小和问题-java实现

时间:2023-04-11 23:33:59浏览次数:36  
标签:归并 java int arr merge 序列 排序

什么是归并排序

归并排序(Merge Sort)是一种基于分治思想的排序算法,它的基本思想是将待排序的序列不断地分割成两个子序列,直到每个子序列只有一个元素,然后再将这两个子序列合并成一个有序的序列。

归并排序的基本步骤如下:

1.将待排序序列分成两个子序列,分别进行排序。
2.将两个已排序的子序列合并成一个有序的序列。
3.重复步骤1和步骤2,直到所有元素都排序完成。
归并排序的时间复杂度为 O(nlogn),是一种稳定的排序算法。1. 1. *

利用归并排序解决一道实际的算法题.小和问题

题目:
在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数 组的小和。求一个数组的小和
示例:
输入:[5 3 2 4 9]
输出:19
解释:
5左边比它小的元素之和为0,
3左边比它小的元素之和为0,
2左边比它小的元素之后为0,
4左边比他小的元素之后为3+2=5,
9左边比他小的元素之后为5+3+2+4=14,
所以最终结果为:0 + 0 + 0 + 5 + 14 = 19

解题思路

其实也很简单,只要你了解了归并排序,那么在归并排序的过程时,我们需要合并拆分的两个数组,那么在合并的过程中,比较下左右两边数字的大小,符合左边比右边小的数字就加起来,就实现了小和问题,实际就在归并排序的基础上增加了一行代码.

public static int smallSum(int[] arr) {
		if (arr == null || arr.length < 2) {
			return 0;
		}
		return process(arr, 0, arr.length - 1);
	}

开始写递归方法

	// 所有merge时,产生的小和,累加
	// 左 排序   merge
	// 右 排序  merge
	// merge
	public static int process(int[] arr, int l, int r) {
		if (l == r) {
			return 0;
		}
		// l < r
		int mid = l + ((r - l) >> 1);
		return 
				process(arr, l, mid) 
				+ 
				process(arr, mid + 1, r) 
				+ 
				merge(arr, l, mid, r);
	}

再来实现merge 计算和排序的过程

public static int merge(int[] arr, int L, int m, int r) {
		int[] help = new int[r - L + 1];
		int i = 0;
		int p1 = L;
		int p2 = m + 1;
		int res = 0;
		while (p1 <= m && p2 <= r) {
			res += arr[p1] < arr[p2] ? (r - p2 + 1) * arr[p1] : 0;
			help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
		}
		while (p1 <= m) {
			help[i++] = arr[p1++];
		}
		while (p2 <= r) {
			help[i++] = arr[p2++];
		}
		for (i = 0; i < help.length; i++) {
			arr[L + i] = help[i];
		}
		return res;
	}

标签:归并,java,int,arr,merge,序列,排序
From: https://www.cnblogs.com/vip1024/p/17308268.html

相关文章

  • JavaScript编程实现tab选项卡切换的效果+1
    之前在“圳品”信息系统使用了tab选项卡来显示信息,详见:JavaScript编程实现tab选项卡切换的效果在tab选项卡中使用其它<div>来显示信息就出现了问题,乱套了,比如下面的这段代码:<!DOCTYPEhtml><html><head><metaname="Author"content="PurpleEndurer"><title>“圳品”信息系......
  • JSON数据与java对象转换
    JSON数据与java对象转换环境:导入依赖:<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency>样例:publicstaticvoidmain(String[]args){//1.将java对象转换为ja......
  • java学习日记20230410-List
    List接口基本介绍List集合类中元素有序,即添加顺序和取出顺序一致,且可重复;List集合中的每隔元素都有其对应的顺序索引,即支持索引List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素JDKAPI中List接口的实现类有:ArrayListLinkedListVe......
  • Javaweb-登录界面-filter配合案例-2023-04-11
    1、新建login.jsp登录界面响应的路径<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>Login</title></head><body><h1>登录界面</h1><hr><form......
  • javaEE进阶小结与回顾(五)
    字符集字符集基础一堆字符的集合,包含很多字符,并且每个字符都有一个数字编号与之对应常见字符集有:ASCII字符集,GBK字符集,Unicode字符集等计算机根据字符集,可对字符进行编码,以便计算机识别和存储各种文字常用字符集ASCII字符集美国信息交换标准代码,包括了数......
  • Java-Day-8(方法重载 + 可变参数 + 作用域 + 构造方法 + this 关键字 )
    Java-Day-8方法重载(Overload)java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致在调用方法时,通过所给的参数来选择执行的是哪个方法重载好处减轻了起名的麻烦减轻了记名的麻烦注意细节方法名必须相同参数列表必须不同形参类型或个数或顺序,......
  • 【Java 线程池】【四】ThreadPoolExector中的Worker工作者原理
    1 前言上一节我们看了ThreadPoolExecutor线程池的execute内部方法流程,addWorker方法流程,看到Worker是线程池内部的工作者,每个Worker内部持有一个线程,addWorker方法创建了一个Worker工作者,并且放入HashSet的容器中,那么这节我们就来看看Worker是如何工作的。2  内部属性我们......
  • Day14_Java_作业
    编程题:1:获取10个1-20之间的随机数,要求不能重复答:packageStudentWork;importjava.util.ArrayList;/****需求:1:获取10个1-20之间的随机数,要求不能重复*@authorAoman_Hao*/publicclassDay14_Work_Demo{publicstaticvoidmain(String[]args)......
  • 通过java实现word转PDF
    通过java实现word转PDF原文链接:https://blog.csdn.net/ka3p06/article/details/125476270介绍用于java项目中解决word转pdf的需求,转换的效果跟调用的工具类、字体库、源文件(是wps还是microsoft保存的,格式版本等)、系统环境等多个因素相关,没有百分百完成的方法,只有不断尝试,......
  • Java实现PDF转Word
    Java实现PDF转Word原文链接:https://blog.csdn.net/Mgg9702/article/details/1249874831、引入jar包或依赖这里用到的是aspose-pdf,这个依赖需要单独配置仓库地址,也可以直接去官网下载jar包<repositories> <repository> <id>AsposeJavaAPI</id> <name>AsposeJavaAPI<......