算法学习3

news/2024/10/5 17:26:57 标签: 算法, 学习, 排序算法

学习目录

  • 1.递归行为时间复杂度
  • 2.归并排序
    • 1.求小和问题

1.递归行为时间复杂度

需要使用master公式:
T(N) = a * T(N / b) + O(N d)
a:表示在递归函数中递归函数被使用的次数
b:表示每个递归函数计算个数占整体多少份的倒数
O(N d):表示在整个递归函数中除去调用函数的其他代码的时间复杂度

如:
递归函数的代码

int process(int[] arr,int L,int R){
	if(L == R)
		return arr[L];
	int mid = L + ((R - L) >> 1);
	int leftMax = process(arr,L,mid);
	int rightMax = process(arr,mid + 1,R);
	return Math.max(leftMax,rightMax);
}

其master公式为:
T(N) = 2 * T (N / 2) + O(1)

时间的复杂度:

  1. 当logba < d 时,其时间复杂度为O(Nd)
  2. logba = d 时,其时间复杂度为O(Nlog(b,a))
  3. logba > d 时,其时间复杂度为O(Nd * logN)

2.归并排序

原理:
将数组分为左右两部分,分别对左右两部分进行排序;
从左右部分的第一个数进行比较大小,将大(或者小)的数拷贝到一个辅助数组的第一个位置;
取左右部分中已经拷贝的元素的下一位数,与另外部分未拷贝的元素接着比较,并拷贝到辅助数组中,直到左右部分中的其中一部分全部拷贝过一遍;
接着将左右部分中未完全拷贝的部分,按照其当前顺序全部拷贝到辅助数组中;

其代码如下:

//分别将左右部分进行排序
public void process(int[] arr,int L,int R){
	if(L == R)
		return arr[L];
	int mid = L + ((R - L) >> 1);
	int leftMax = process(arr,L,mid);
	int rightMax = process(arr,mid + 1,R);
	merge(arr,L,mid,R);
}

//将整体进行排序
public void merge(int[] arr,int L,int M,int R){
	int[] help = new int[R - L + 1];
	int i = 0;
	//p1为左边部分的下标,p2为右边部分的下标
	int p1 = L;
	int p2 = M + 1

	//对左右下标的元素进行比较,并将合适的数拷贝到辅助数组中
	while(p1 <= M && p2 <= R){
		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 + 1] = help[i];
	}
}

1.求小和问题

在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和;
举例:
数组[1,3,4,2,5],其中1左边比1小的数没有,3左边比3小的数为1,以此类推,者可以得到小和为:1+1+3+1+1+3+4+2=16;

解决这个问题可以使用归并排序进行快速的求出小和;
原理:
在这里插入图片描述
如上图左边最后一层中,将左右两边进行比较,当右边指针指向的数大于左边指针指向的数时,记录一个左边当前指针的数值,数值即为1,该数值即小和的一部分;
将最后一层的左右数值进行排序,把排好序的数组与上一层进行重复大小比较;
直至将整体数组大小排好序,即可获得小和;

代码:

public void process(int[] arr,int L,int R){
	if(L == R)
		return arr[L];
	int mid = L + ((R - L) >> 1);
	
	//在最开始调用时,第一个函数调用表示整体数组左边产生的小和
	//在最开始调用时,第二个函数调用表示整体数组右边产生的小和
	//第三个函数调用表示每层左右合并时产生的小和
	return process(arr,L,mid) + process(arr,mid + 1,R) + merge(arr,L,mid,R);
}

//将整体进行排序
public void 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 + 1] = help[i];
	}
	return res;
}

http://www.niftyadmin.cn/n/5691087.html

相关文章

软质电源探秘:电鳗启发、人工构建及性能改进

今天我们将深入了解一种受电鳗启发的软质电源文章——《An Electric Eel-Inspired Soft Power Source from Stacked Hydrogels》发表于《Nature》。在科技与生物融合的探索之路上&#xff0c;电源的创新至关重要。传统电池难以满足生物体内应用的需求。电鳗的发电器官却展现出独…

【React】增量传输与渲染

增量传输 增量传输是一种高效的文件传输方式&#xff0c;其核心原理在于只传输文件中发生变化的部分&#xff0c;而不是整个文件。以下是增量传输的详细解析&#xff1a; 定义与原理&#xff1a; 增量传输通过比对原始文件和目标文件&#xff0c;找出两者之间的差异部分&#…

【ubuntu】ubuntu20.04安装chrome浏览器

1.下载 https://download.csdn.net/download/qq_35975447/89842972 https://www.google.cn/chrome/ 2.安装 sudo dpkg -i google-chrome-stable_current_amd64.deb 3.使用

【MySQL】Ubuntu环境下MySQL的安装与卸载

目录 1.MYSQL的安装 2.MySQL的登录 3.MYSQL的卸载 4.设置配置文件 1.MYSQL的安装 首先我们要看看我们环境里面有没有已经安装好的MySQL 我们发现是默认是没有的。 我们还可以通过下面这个命令来确认有没有mysql的安装包 首先我们得知道我们当前的系统版本是什么 lsb_…

蓝桥等级考试C++组17级真题-2023-05-21

单项选择题 **1、CL17(15分)**选择题 关于面向对象&#xff0c;以下说法正确的是( ) A. C语言是面向对象的语言 B. C语言只支持面向对象的程序设计 C. C语言是面向对象的语言&#xff0c;但C语言不是 D. C语言中的类和int、char等类型一样&#xff0c;都是基本数据类型 2、CL1…

MySQL表操作(进阶)

一、数据库约束 1、约束类型 NOT NULL - 指示某列不能存储 NULL 值 UNIQUE - 保证某列的每行必须有唯一的值 DEFAULT - 规定没有给列赋值时的默认值 PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列&#xff08;或两个列多个列的结合&#xff09;有唯一标 识&#xff…

C初阶(十二)do - while循环 --- 致敬革命烈士

大家国庆看阅兵仪式和天安门升旗仪式了吗&#xff1f;岁月安好&#xff0c;只因有人负重前行。 ————山那边是什么 ————是烈士的英魄 ————是他们拼死保卫的新中国 ————河那边是什么 ————是绵延的战火 ————她望着远方泪一滴滴的落 ————和平来了 ——…

创建Vue项目的时出现:无法加载文件 E:\software\node\node_global\vue.ps1,因为在此系统上禁止运行脚本

创建Vue项目的时出现的问题:出现&#xff1a;无法加载文件 E:\software\node\node_global\vue.ps1&#xff0c;因为在此系统上禁止运行脚本 解决方法&#xff1a; .PowerShelll的执行政策阻止了该操作,用 get-ExecutionPolicy 查看执行策略的状态为受限 输入Set-ExecutionPo…