八大排序(插入排序 | 选择排序 | 冒泡排序)

2023-12-16

在我们内存中我们一般会有一些没有顺序的数据,我们成为内排序,而今天分享八大排序的是时间复杂度为O(N^2)的插入排序,选择排序和教学意义比较强的冒泡排序。

插入排序

这是插入排序的动图,通过动图我们也是可以看到我们的插入排序的思想

从当前的位置往前找小,如果当前位置的值是比前面的位置下的,前面位置往后挪动覆盖,因为会覆盖当前的位置,所以我们需要一个key来保存我们的当前的位置,如果往前找位置的时候,这个位置的值是比我们当前位置的值小的时候,循环就开始停下来,这个时候我们退出循环,在进行插入就是插入排序,我们先来看看我们的代码,然后画图来给大家看看。

void InsertSort(int* a, int n)
{

	for (int i = 0; i < n - 1; i++)
	{
		int end = i;
		int key = a[end + 1];
		while (end >= 0)
		{
			if (a[end] > key)
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = key;
	}

}

代码是很简短的,我们给个数组是{9, 8, 7, 6, 5, 4, 3, 2, 1}。

end需要往前移动找小,如果比他大,那这个位置的数就得往后移动。

选择排序

void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
void SelectSort(int* a, int n)
{
	
	for (int j = 0; j < n; j++)
	{
		int mini = j;
		for (int i = j; i < n; i++)
		{
			if (a[i] < a[mini])
			{
				mini = i;
				
			}
			i++;

		}
		Swap(&a[mini], &a[j]);
	}
	
}

这个就是选择排序的基础玩法,但是这个选择排序我们一次只找出最小的值,我们这里还是遍历一遍数组了,遍历一遍数组只找出一个值还是有点亏,所以我们可以优化一下,一次性找出两个值,分别是最大值和最小的值,但是!优化后还是有些缺点,就是存在覆盖问题,我们来先看看代码吧。

void SelectSort(int* a, int n)
{
	
	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{
		int mini = begin;
		int maxi = begin;
		for (int i = begin; i <= end; i++)
		{
			if (a[i] < a[mini])
			{
				mini = i;
			}
			if (a[i] > a[maxi])
			{
				maxi = i;
			}
			
		}
		Swap(&a[begin], &a[mini]);
		if (begin == maxi)
		{
			maxi = mini;
		}
		Swap(&a[end], &a[maxi]);
		begin++;
		end--;
	}
}

优化之后判断哪个地方需要我们注意一下,因为begin的位置可能开始就是最大值,这里还需要注意的就是我们的maxi和mini一定要放到循环里面,因为你不放进去他每次都是从一开始的begin,就是下标0开始,这样会打乱我们刚开始的排序。

冒泡排序

冒泡排序还不简单,我们直接手搓,要是这个小编还能写错,我直接eat  big shit

void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
void BubbleSort(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		int j = 0;
		for (j = 0; j < n -1 - i; j++)
		{
			if (a[j] > a[j + 1])
			{
				Swap(&a[j], &a[j + 1]);
					
			}
			
			
		}
	}
}

那我们的三个时间复杂度是O(N^2)的排序也是终于完成了。我们下次来讲讲在插入排序的基础上实现希尔排序。

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

八大排序(插入排序 | 选择排序 | 冒泡排序) 的相关文章

随机推荐

  • 【Linux】系统初识之冯诺依曼体系结构与操作系统

    樊梓慕 个人主页 个人专栏 C语言 数据结构 蓝桥杯试题 LeetCode刷题笔记 实训项目 C Linux 每一个不曾起舞的日子 都是对生命的辜负 目录 前言 1 冯诺依曼体系结构 2 操作系统 OS 1 用户到操作系统再到底层是如何组织
  • 【教程】app备案流程简单三部曲即可完成

    APP备案流程包括以下步骤 1 开发者实名认证 在提交备案申请之前 开发者需要通过移动应用开发平台进行实名认证 这个步骤需要提供身份证号码 姓名 联系方式等信息 并上传相关证件照片或扫描件 2 应用信息登记 开发者需要在应用商店或应用发布平
  • 【Linux】进程周边002之进程状态

    樊梓慕 个人主页 个人专栏 C语言 数据结构 蓝桥杯试题 LeetCode刷题笔记 实训项目 C Linux 每一个不曾起舞的日子 都是对生命的辜负 目录 前言 1 什么是状态 1 1运行 1 2阻塞
  • C/C++查找算法-----------------------二分查找详解

    二分查找 定义 实例 定义 二分查找也称折半查找 搜索过程从数组的中间元素开始 如果中间元素正好是要查找的元素 则搜索过程结束 如果某一特定元素大于或者小于中间元素 则在数组大于或小于中间元素的那一半中查找 而且跟开始一样从中间元素开始比较
  • 华为OD机试真题-文本统计分析-2023年OD统一考试(C卷)

    题目描述 有一个文件 包含以一定规则写作的文本 请统计文件中包含的文本数量 规则如下 1 文本以 分隔 最后一条可以没有 但空文本不能算语句 比如 COMMAND A 只能算一条语句 注意 无字符 空白字符 制表符都算作 空 文本 2 文本
  • 华为OD机试真题-求幸存数之和-2023年OD统一考试(C卷)

    题目描述 给一个正整数列 nums 一个跳数 jump 及幸存数量 left 运算过程为 从索引为0的位置开始向后跳 中间跳过 J 个数字 命中索引为J 1的数字 该数被敲出 并从该点起跳 以此类推 直到幸存left个数为止 然后返回幸存数
  • 【教程】源代码加密、防泄密软件

    什么是代码混淆 代码混淆 是一种将应用程序二进制文件转换为功能上等价 但人类难于阅读和理解的行为 在编译 Dart 代码时 混淆会隐藏函数和类的名称 并用其他符号替代每个符号 从而使攻击者难以进行逆向工程 Flutter 的代码混淆功能仅在
  • Axure中动态面板使用及轮播图&多种登录方式&左侧导航栏之案列

    艳艳耶 个人主页 个人专栏 越努力 越幸运 目录 一 轮播图简介 1 什么是轮播图 2 轮播图有什么作用 3 轮播图有什么特点 4 轮播图适应范围 5 动态面板的入门教程 6 轮播图案列 二 多种方式登录 1 什么是多种方式 2 常见的多种
  • 2023年度盘点:智能汽车、自动驾驶、车联网必读书单

    文末送书 今天推荐几本自动驾驶领域优质书籍 前言 2023年 智能驾驶和新能源汽车行业仍然有着肉眼可见的新进展 自动驾驶技术继续尝试从辅助驾驶向自动驾驶的过渡 更重要的是相关技术成本的下降 根据 全球电动汽车展望2023 等行业报告 预计2
  • 【Linux】进程周边003之进程优先级

    樊梓慕 个人主页 个人专栏 C语言 数据结构 蓝桥杯试题 LeetCode刷题笔记 实训项目 C Linux 每一个不曾起舞的日子 都是对生命的辜负 目录 前言 1 基本概念 2 PRI与NI
  • 计算机毕业设计-基于Java+Springboot架构的点餐平台网站项目开发实战(附论文+源码)

    大家好 我是职场程序猿 感谢您阅读本文 欢迎一键三连哦 当前专栏 Java毕业设计 精彩专栏推荐 安卓app毕业设计 微信小程序毕业设计 开发环境 开发语言 Java 框架 springboot JDK版本 JDK1 8 服务器 tomca
  • 找不到mfc100u.dll,程序无法继续执行?三步即可搞定

    在使用电脑过程中 我们经常会遇到一些错误提示 其中之一就是 找不到mfc100u dll mfc100u dll是Microsoft Foundation Class MFC 库中的一个版本特定的DLL文件 MFC是微软公司为简化Windo
  • 平面腔体谐振计算与仿真

    PCB的电源网络是由电介质材料隔开的两个平行金属板所组成 可以通过以下的3种方法对其谐振模式进行分析 1 基于腔体模型的计算 2 基于SPICE等效电路 3 基于全波数值电磁算法的3D模型 设计得当的前提下 上述3种方法可以得到相同的结果
  • 如何做好性能压测?压测环境设计和搭建的7个步骤你知道吗?

    简介 一般来说 保证执行性能压测的环境和生产环境高度一致是执行一次有效性能压测的首要原则 有时候 即便是压测环境和生产环境有很细微的差别 都有可能导致整个压测活动评测出来的结果不准确 1 性能环境要考虑的要素 1 1 系统逻辑架构 系统逻辑
  • 计算机毕业设计-基于Java+Springboot架构的学生毕业离校系统项目开发实战(附论文+源码)

    大家好 我是职场程序猿 感谢您阅读本文 欢迎一键三连哦 当前专栏 Java毕业设计 精彩专栏推荐 安卓app毕业设计 微信小程序毕业设计 开发环境 开发语言 Java 框架 springboot JDK版本 JDK1 8 服务器 tomca
  • 【Spring Boot】内网穿透实现远程调用调试

    文章目录 1 本地环境搭建 1 1 环境参数 1 2 搭建springboot服务项目 2 内网穿透 2 1 安装配置cpolar内网穿透 2 1 1 windows系统
  • Linux基础指令(2)

    今天我们继续来学我们有关于Linux的指令 今天的指令要比上次多多了 开始我们的学习吧 man手册 先来看标题 手册我们第一时间想到的就是手册的查阅功能 我们都知道在我们上小学的时候 如果遇到不会的字 我们会通过查阅字典来读取这个字的拼音
  • 548、基于51单片机的比赛计分仿真设计(简易,LCD1602,独立按键)

    毕设帮助 开题指导 技术解答 有偿 见文末 目录 一 设计功能 二 proteus仿真 三 原理图 四 程序源码 五 资料包括 一 设计功能 二 proteus仿真 三 原理图 四 程序源码 五 资料包括
  • 二叉树(接口函数的实现)

    今天继续来分享的是二叉树 我们废话不多说 直接来看下面的几个接口函数 然后我们把他们实现 我们就掌握二叉树的二分之一 今天粉丝破千了 属实有点高兴了 typedef char BTDataType typedef struct Binary
  • 八大排序(插入排序 | 选择排序 | 冒泡排序)

    在我们内存中我们一般会有一些没有顺序的数据 我们成为内排序 而今天分享八大排序的是时间复杂度为O N 2 的插入排序 选择排序和教学意义比较强的冒泡排序 插入排序 这是插入排序的动图 通过动图我们也是可以看到我们的插入排序的思想 从当前的位