个人总结-基础算法

2023-11-01

基础算法

各个算法的复杂度及稳定性等

在这里插入图片描述

冒泡排序(蛮力法)

理解

首先,先理解什么是冒泡排序。
在这里插入图片描述
在这里插入图片描述冒泡排序是属于快速排序中简单的算法,顾名思义,类似于泡泡向上浮动,至于最后大的在前面还是在后面由自己决定。

函数代码

这里使用的冒泡排序是通过蛮力法实现的,函数展示如下:

public void BulleSort(int r[],int n) {
		int bound,exchange=n-1;
		while(exchange!=0)
		{
			bound=exchange;exchange=0;
			for(int i=0;i<bound;i++)
			{
				if(r[i+1]<r[i])
				{
					int temp=r[i];
					r[i]=r[i+1];
					r[i+1]=temp;
					//只要交换了,那一定是后面的,有可能一趟排好多个,比如第二躺直接55、65都拍好了
					exchange=i;
				}
				
			}
		}
	}

这里如果用用两个for的话总共要进行n-1躺,但用while可以不用进行那么多次,其中两个for,第一个是躺数,第二个是比较相邻位置。

测试用例

使用的测试用例:

		int r[]= {50,13,55,97,27,38,49,65};
		int n=r.length;
		sortAlogrithm bs = new sortAlogrithm();
		bs.BulleSort(r, n);

选择排序(蛮力法)

理解

这里主要说的是简单选择排序,它属于选择排序中(还包括树形选择排序和堆排序):
在这里插入图片描述简单选择排序就是每次排序都将其中最小(大)的数值选择出来,放到前面,最后就是有序的。

函数代码

使用的函数代码如下:

public static void SelectSort(int r[],int n)
	{
		int index;
		for(int i=0;i<n-1;i++) 
		{
			index=i;
			for(int j=i+1;j<n;j++)
			{
				if (r[j]<r[index])
					index=j;
			}
			if (index!=i)
			{
				int temp=r[i];
				r[i]=r[index];
				r[index]=temp;
			}
		}
	}

第一个for循环是总的比较次数,第二个是将当前的和后面的每个对比大小,比后面的大就交换,最后将最小的放到前面。

测试用例

测试用例:

		int r[] = {49,27,65,76,38,13};
		int n = r.length;
		SelectSort(r,n);

归并排序(分治法)

理解

归并排序又是另一种排序算法,这里主要讲述2路归并排序。
在这里插入图片描述在这里插入图片描述在这里插入图片描述将给定的数值分成两部分,两两分开对比,最后合并。

函数代码

函数代码:

public static void Merge(int r[],int r1[],int s,int m,int t)//合并子序列
	{
		int i=s,j=m+1,k=s;
		while(i<=m && j<=t) {
			if(r[i] <= r[j]) r1[k++] = r[i++]; //小的放进r1中
			else r1[k++] = r[j++];
		}
		while (i<=m) r1[k++] = r[i++];  //左边没排完
		while (j<=t) r1[k++] = r[j++];  //右边没排完
	}
	public static void MergeSort(int r[],int s,int t)//进行分组
	{
		int m;
		int r1[]=new int[r.length];  //r1用来装有序的数组
		if(s==t) return; //如果相等就返回
		else{
			m=(s+t)/2;
			MergeSort(r,s,m);
			MergeSort(r,m+1,t);
			Merge(r,r1,s,m,t);
			for (int i=s;i<=t;i++) {
				r[i]=r1[i];
			}
		}
	}

测试用例

测试用例:

		int r[] = {8,3,2,6,7,1,5,4};
		int s=0,n=r.length;
		MergeSort(r,s,r.length-1);

快速排序 (分治法)

理解

在这里插入图片描述在这里插入图片描述在这里插入图片描述
快速排序就是通过将最开始的数和最后面的一个开始对比,如果比最后一个小则和倒数第二个对比,以此类推,找到比选定的第一个数小的值,就将其放到第一个,然后从头开始找,找到比选定值大的,将其放到之前找到小的数值那里,从刚发的那个位置前一个,又从头往后找,最终,第一次对比结束后,排在选的值前面的都是比它小的,在它后面的都是比它大的,由此,就完成了初步划分,之后,对两边重复之前的操作。最后就得到了有序数列。

函数代码

public static int Partition(int r[],int first,int end)
	{
		int i=first,j=end;
		while (i<j) {
			while(i<j && r[i] <= r[j])j--;
			if (i<j)
			{
				int temp=r[i];
				r[i]=r[j];
				r[j]=temp;
				i++;
			}
			while(i<j && r[i] <= r[j])i++;
			if (i<j)
			{
				int temp=r[i];
				r[i]=r[j];
				r[j]=temp;
				j--;
			}
		}
		return i;
	}
	public static void QuickSort(int r[],int first,int end)
	{
		int privot;
		if (first < end)
		{
			privot=Partition(r,first,end);
			QuickSort(r,first,privot);
			QuickSort(r,privot+1,end);
		}
	}

测试用例

		int r[]= {23,13,35,6,19,50,28};
		int n=r.length;
		QuickSort(r,0,r.length-1);

插入排序(减治法)

理解

插入排序可以分为直接插入排序、其它插入排序(折半插入排序、2-路插入排序、表插入排序 )和希尔排序。这里讲述的是直接插入排序,使用的是减治法(堆排序也是减治法)。
在这里插入图片描述在这里插入图片描述主要就是将选定的一个数作为“哨兵”,让它和前面的数进行大小对比,从前面最后一个数往前对比,小于前面的数就将前面的数往后移,大于前面的数就放在当前位置,下一个数作为“哨兵”重复之前的操作。于是,前面的都是有序的,后面的都是无序的,最后全部有序。(这里为了防止溢出,我将数组的第一位作为“哨兵”位,给定了一个0值,这样其实会有其他影响。)

函数代码

public static void InsertSort(int r[],int n)
	{
		for(int i=2;i<n;i++)
		{
			int j=i-1;
			r[0]=r[i];
			for (;r[0]<r[j];j--)
				r[j+1]=r[j]; //记录后移
			r[j+1]=r[0];
		}
	}

测试用例

		int r[] = {0,12,15,9,20,10,6};
		InsertSort(r,r.length);
		for(int i=1;i<r.length;i++)
			System.out.print(r[i]+" ");

希尔排序

理解

在这里插入图片描述希尔排序主要在于选定一个好的增量,基本思想是先将整个待排序数列分割成若干个子序列分别进行直接插入排序,待整个序列基本有序再对整体进行插入排序。
对插入算法进行修改
在这里插入图片描述希尔排序算法描述:
在这里插入图片描述对增量的选择:
在这里插入图片描述
代码以后有缘补。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

个人总结-基础算法 的相关文章

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • php no route to host,解决 重启后zerotier无法远程连接,显示”no route to host”

    解决 重启后zerotier无法远程连接 显示 no route to host 第一步 禁用桌面环境 桌面环境重启时经常会无原无故卡住 导致远程连不上 systemctl set default graphical target 第二步
  • ubuntu 20.04 安装make_ext4fs

    制作文件系统发现 sudo make ext4fs command not found 解决方法 sudo apt install android sdk ext4 utils sudo apt install e2fsprogs sudo
  • 使用纯C语言定义通用型数据结构的方法和示例

    文章目录 前言 以实现优先队列来描述实现思想 基本类型的包装类型 比较函数 演示 总结 前言 最近一段时间在复习数据结构和算法 用的C语言 不得不说 不学个高级语言再回头看C语言根本不知道C语言的强大和完美 不过相比之下也有许多不便利的地方
  • 历时30个小时 更新到了25905.1000 版本 23H2

  • 【Vue3】之vuex的安装与配置

    安装 yarn add vuex 4 或 npm install save vuex 4 创建 新建store js store js import createStore from vuex export default createSt
  • Pyinstaller 使用说明

    安装 cmd pip install pyinstaller 也可以自己下载安装包 解压后通过执行python setup py install 使用 pyinstaller F myPython py 或者用python pyinstal
  • 用IDEA创建第一个SpringBoot程序,并开发一个JSON接口

    1 打开idea主界面选择 Create New Project 2 在弹出的页面中我们选择左侧的 Spring Initializr jdk版本选择自己安装的版本 PS jdk版本要1 8以上哦 3 下一个页面 在Group栏输入组织名
  • IDEA代码覆盖率测试

    代码覆盖率测试 1 使用idea自带的代码覆盖率工具 1 创建test文档 右击将 test 目录设置为测试文档 2 选中需要测试的类 按Ctrl shift T 创建测试类 并选中要测试的方法 在测试案例中 编写测试代码 点击Edit C
  • 小程序分包实现

    目录 一 使用场景 二 操作方式 1 建立分包文件夹 2 文件构建 3 文件配置 三 总结 一 使用场景 微小程序分包常用于代码量较大的小程序 发布时会受到大小限制 二 操作方式 1 建立分包文件夹 在项目根目录下创建分包文件夹 此处我创建
  • L1-8 乘法口诀数列

    本题要求你从任意给定的两个 1 位数字 a1 和 a2 开始 用乘法口诀生成一个数列 an 规则为从 a1 开始顺次进行 每次将当前数字与后面一个数字相乘 将结果贴在数列末尾 如果结果不是 1 位数 则其每一位都应成为数列的一项 输入格式
  • ad电阻原理图_光敏电阻的基础知识介绍

    39G电子技术 电路 电子元件等 全套资料免费领 干货下载 十天学会单片机完整版 100个实例 PPT 点击上方红字 即可获取 一 光敏电阻 光敏电阻是用硫化隔或硒化隔等半导体材料制成的特殊电阻器 表面还涂有防潮树脂 具有光电导效应 二 特
  • TCP 拥塞窗口原理

    学过网络相关课程的 都知道TCP中 有两个窗口 滑动窗口 在我们的上一篇文章中有讲 接收方通过通告发送方自己的可以接受缓冲区大小 这个字段越大说明网络吞吐量越高 从而控制发送方的发送速度 拥塞窗口 也就是本文要讲的 概念 一个连接的TCP双
  • element-plus elplus el-tree三种图标自定义 并且点击图标展开收起 点击文字获取数据

    前言 公司需求 需要实现如下样式的树形列表 基于vue3 element plus 当节点展开时 显示展开的文件夹图标 当节点收起时显示收起的文件夹 最后一级显示文件样式 废话没有了 代码如下
  • C规范编辑笔记(九)

    往期文章 C规范编辑笔记 一 C规范编辑笔记 二 C规范编辑笔记 三 C规范编辑笔记 四 C规范编辑笔记 五 C规范编辑笔记 六 C规范编辑笔记 七 C规范编辑笔记 八 正文 今天我们来分享一下C规范编辑笔记第九篇 话不多说 我们直接来看
  • 树莓派数据远程传输学习记录——TCP/IP协议连接OneNet云平台传输数据的方法

    目录 项目场景 问题描述 解决方案 OneNet云平台前期项目搭建准备 以网络调试助手模拟树莓派建立连接并发送数据 树莓派与OneNet云平台进行对接 最后总结 项目场景 本人在进行树莓派项目开发时进行数据远程传输 4G WiFi通信 过程
  • Spark 3.0.3 源码阅读及 idea 调试环境搭建

    目录 1 源码下载 2 源码解压并编译 3 使用 Idea 打开或导入 4 idea 调试环境设置 Master 设置 Worker 设置 1 源码下载 Downloads Apache Spark 2 源码解压并编译 编译前建议在环境变量
  • ingress 400 Bad Request The plain HTTP request was sent to HTTPS port

    问题现象 访问时返回400 Bad Request 并提示The plain HTTP request was sent to HTTPS port 问题原因 Ingress Controller到后端Pod请求使用了默认的HTTP请求 但
  • 效果:网页页面随机改变颜色+自定义样式背景颜色随机改变+20秒倒计时+时间一到马上跳转新页面

  • linux 安装flash

    2 將下载好的包拷到某个目录下并解压得到文件 得到如下libflashplayer so文件与usr文件夹 3 将libflashplayer so拷到firefox的插件目录 usr lib mozilla plugin 下 sudo c
  • 个人总结-基础算法

    文章目录 基础算法 各个算法的复杂度及稳定性等 冒泡排序 蛮力法 理解 函数代码 测试用例 选择排序 蛮力法 理解 函数代码 测试用例 归并排序 分治法 理解 函数代码 测试用例 快速排序 分治法 理解 函数代码 测试用例 插入排序 减治法