学习部分排序,插入排序,冒泡排序以及希尔排序

news2024/9/29 15:20:05

1.插入排序

<1>.首先我们举个例子

我们要把6进行前面的插入,那我们要进行比较,首先确定一个end的指针,然后他指向的数字就是我们需要比较的,如果end指向的数比我们end+1 的大的话,那我们就往前挪一个,让end指向的数位置换到刚才end+1 的位置,也就是6的位置。然后end--,如果end指向的数比6小大,我们循环停止。如果按照我们的例子来看,那么就应该是这样的

那么我们前面的的数怎么办,他们还没有成为有序的数组,那如果我们前面一开始就是有序的,那么是不是从后面开始比较,然后停止的时候,是不是就全都是有序的。那我们如果从一开始,一点一点让他们成为有序的,一直到end指向数组最后一个数的前一个数,然后进行刚才的比较,那么全都是有序的。也就是说应该是这样的

第一次单个3就算是有序的数组,然后和五进行比较

第二次,3 5 和8进行比较然后3 5 8就是有序的

第三次,3 5 8和4 开始比较,那么按照顺序就是 3 4 5 8.。。。。依次类推,然后 我们就得到了排序

那么end就是在有序数组的最后一个,然后把end+1的位置存进tmp,如果比较成立,end的数字向后移动,覆盖end+1位置的数,当如果是逆序排列,end就会到达-1的位置,那么遍历也就结束了,这也成为了我们while的判断条件

void InsertSort(int* arr, int n)
{
	for(int i=0;i<n-1;i++)
	{ 
	 int end=i;
	 int tmp = arr[end + 1];
	 while (end >= 0)
	 {
		if (arr[end] > tmp)
		{
			arr[end + 1] = arr[end];
			end--;
		}
		else
		{
			break;
		}
		
	 }
	arr[end + 1] = tmp;
	}
}

代码就是这样写的

提醒大家的是while循环结束后,把end+1的位置放tmp,就是我们每次较完之后end,如果要进行挪动,那么end最后的位置就是空的,那么我们就要把刚才存的end+1的位置的数字tmp存进去。

2冒泡排序

冒泡排序我们在c语言里面实现过我们就不多说了

第一层循环时为了把第一个数依次向后比较,第二层控制第一层进行比较的次数,第一次,最后一个数就排好了,那么第一层循环就少了一层。

void BubbleSort(int* arr, int n)
{
	for (int i = 0; i < n-1; i++)
	{
		int exchang = 0;
		for (int j = 1; j < n - i; j++)
		{
			if (arr[j - 1] > arr[j])
			{
				Swap(&arr[j - 1], &arr[j]);
				exchang = 1;
			}
			
		}if (exchang == 0)
			{
				break;
			}
	}
}
void Swap(int* x, int* y)
{
	int t = *x;
	*x = *y;
	*y = t;
}

3.希尔排序

希尔排序时我们以插入排序为基础,比之前有点难度。、

按照之前的希尔排序在我们设立的每次依次分的有序数组,他进行规范行的分组,画图

假设我们每次规定的一个数组是间隙三个的,然后我们第一次调整蓝色的有序数组,那么第一次就是3为有序数组,然后和4 比较,接着3 4和7 比较

接着红色这组,再然后绿色的。这样遍历就可以。我们红色算一组,可以按照刚才的插入的排序写一个循环,我们怎么知道我们要循环几次,其实间隙是几,我们就循环几次。先实现一下。

int gap = 3;这个写法是进行固定一个小组进行轮换,然后在进行下一个小组
	for (int j = 0; j < gap; j++)//间隙有几个就进行几次循环
	{
		
		for (int i = 0; i < n - gap; i+=gap)i<gap这样的话最后的end不会越界
		{

			int end = i;
			int tmp = arr[end + gap];
			while (end >= 0)
			{
				if (arr[end] > tmp)
				{
					arr[end + gap] = arr[end];
				}
				else
				{
					break;
				}
			}
			arr[end+gap]=tmp;
		}
	}

n是数组个数,我们为什么要让i小于n-gap(间隙),刚才插入排序是不是小于n-1,其实道理差不多,如果我们end按照间隙加,那最后一次如果超过n不就越界访问了,所以让end<n-gap,使得找end+gap的情况不越界。

那么我们的间隙该怎么定呢。间隙越大,换的越快,越不接近有序数组。间隙越小,换的越慢,越接近有序数组。那我们如果让间隙是变化的,那这样不久越来越好了。应该从大往小变,为什么,第一次间隙为1,直接写成插入排序了。哈哈哈哈。但是这这只是预排序,那么之后该怎么排序才能完全成为有序的呢。那么我们最后一次进行插入排序是不是就可以了。那么正好是不是和刚才的间隙对应上了,如果我们让间隙从大变小,直到变为1,那就完成了希尔排序。第一次的间隙我们取数组的一半,为什么?你想想如果比一半大,那还能找到end+gap的数嘛,直接越界了。哈哈哈哈哈哈哈哈哈哈哈哈。

void ShellSort(int* arr, int n)
{
	int gap = n;
	while (gap)
	{
		gap /= 2;
		for (int i = 0; i < n - gap; i++)//从每个的头开始依次遍历,进行循环调整
		{

			int end = i;
			int tmp = arr[end + gap];
			while (end <n)
			{
				if (arr[end] > tmp)
				{
					arr[end + gap] = arr[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			arr[end + gap] = tmp;
		}
	}
}

有没有发现和刚才不一样,for循环从两个变成一个了,我们进行了改进,反正我们从蓝色完了就是红色,再然后就是绿色。那我们直接从第一个开始依次加间隙,直到end加间隙越界,不就行了。也就是蓝色组第一个,接着红色组第一个,绿色组第一个,然后蓝色第二个。。。。

感谢观看,欢迎指出错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1614628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四六级英语听力考试音频无线发射系统在安顺学院的成功应用分析

四六级英语听力考试音频无线发射系统在安顺学院的成功应用分析 由北京海特伟业科技任洪卓发布于2024年4月22日 安顺学院为了提高学生的外语听力水平&#xff0c;并确保英语四六级听力考试的稳定可靠进行&#xff0c;决定对传统的英语听力音频传输系统进行改造&#xff0c;以提供…

【YOLOv9】实战二:手把手教你使用TensorRT实现YOLOv9实时目标检测(含源码)

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『LabVIEW深度学习实战』 &#x1f4d1;上期文章&#xff1a;『【YOLOv9】实战一&#xff1a;在 Windows 上使用LabVIEW OpenVINO工具…

gitlab 16.x - ERR unknown command ‘HELLO‘

现象 gitlab部分操作报错500。通过Rails日志发现以下报错&#xff1a; 报错&#xff1a; RedisClient::CommandError ERR unknown command HELLO {"severity": "ERROR","time": "2024-04-22T02:50:16.906Z","correlation_id&quo…

3667B芯茂微SOP7封装5V1A 5W适配器/充电器芯片

3667B是一款高度集成的隔离型适配器和充电器的自供电PSR控制芯片&#xff0c;外部设计极其简单。LP3667 固定原边峰值电流&#xff0c;通过变压器原副边匝比来设置输出恒流点&#xff1b;通过设定一个FB 电阻来设置输出恒压点。为了实现系统成本的简化&#xff0c;LP3667 内置启…

CSS基础常用属性之字体属性(如果想知道CSS的字体属性知识点,那么只看这一篇就足够了!)

前言&#xff1a;在我们学习CSS的时候&#xff0c;主要学习选择器和常用的属性&#xff0c;而这篇文章讲解的就是最基础的属性之一——文字属性。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 废话不多说&#xff0c;让我们直…

删除二叉树的子树:假设二叉树中的结点均不相等,采用二叉链存储,设计递归算法删除根结点值为x的子树。(C语言)

目录 实验内容&#xff1a; 实验过程&#xff1a; 1.算法设计 2.程序清单 3.复杂度分析 4.运行结果 实验内容&#xff1a; 删除二叉树的子树:假设二叉树中的结点均不相等&#xff0c;采用二叉链存储&#xff0c;设计递归算法删除根结点值为x的子树。 实验过程&#xff1…

web前端(简洁版)

0. 开发环境 && 安装插件 这里我使用的是vscode开发环境 Auto Rename Tag是语法自动补齐view-in-browser是快速在浏览器中打开live server实时网页刷新 1. HTML 文件基本结构 <html><head><title>第一个页面</title></head><body&g…

PCIe系统阻抗控制85还是100的验证

高速先生成员--周伟 还记得上次的文章&#xff0c;PCIe阻抗控制&#xff0c;85ohm和100ohm哪个好&#xff0c;文章里面只讲到目前的主要问题&#xff0c;但没有给出具体怎么解决这个问题&#xff0c;今天我们就通过无源仿真的方式来聊聊上次那个问题的最终解决方案。 目前我们看…

lvgl图形化设计工具GUI Guider结合使用

前言 上篇博客整合了lvgl到项目中&#xff0c;采用的是自己编写源码的方式&#xff0c;实现了个简单的界面。实际过程中一般情况开发界面都借助设计工具&#xff0c;这里使用的是gui guider来进行示例记录 项目结构&#xff08;生成代码路径依然放到项目路径下&#xff09; C…

Hack The Box-Runner

总体思路 子域名扫描->CVE-2023-42793利用->获取敏感信息->user->端口转发->CVE-2024-21626利用->root 信息收集&端口利用 nmap -sSVC 10.10.11.13目标开放22、80、8000端口&#xff0c;这里先将runner.htb加入到hosts文件后&#xff0c;访问之 查看源…

腾讯后端一面:当 TCP 建立连接之后,TCP 和 UDP 的实时性是不是就差不多了?

更多大厂面试内容可见 -> http://11come.cn 腾讯后端一面&#xff1a;当 TCP 建立连接之后&#xff0c;TCP 和 UDP 的实时性是不是就差不多了&#xff1f; 项目相关 面试官可能是 Go 方向的&#xff0c;我面试的是 Java 方向的&#xff0c;所以面试官也没有问我简历上的项…

信号继电器HBDXH-200/1辅助电源110VDC 启动电压110VDC JOSEF约瑟

用途 适用于直流操作的继电保护和自动控制线路中&#xff0c;作为信号指示用&#xff0c;有多组动合保持触点。满足现场指示和遥信要求。 技术参数 启动信号额定值:直流电流型:10mA~4A. 直流电压型:220VDC、110VDC、48VDC、24VDC 辅助电源电压:220VDC、110VDC、220VAC、110…

华为ensp中MSTP多网段传输协议(原理及配置命令)

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月22日15点29分 在华为ENSP中&#xff0c;MSTP&#xff08;多段传输协议&#xff09;是重要的生成树协议&#xff0c;它扩展了STP&#xff08;生成树协议&#xff09…

舒适护眼模式:苹果手机字体大小怎么设置?

在现代社会&#xff0c;人们对于手机的使用已经不再局限于通讯和娱乐&#xff0c;也逐渐成为了我们生活和工作中不可或缺的一部分。然而&#xff0c;长时间使用手机可能会对我们的视力造成一定程度的影响。 为了更好地保护视力健康&#xff0c;苹果手机提供了舒适护眼的模式&a…

vue3项目使用<img :src=““ />动态加载图片

分享一下使用<img :src"" />动态加载图片时遇到的问题以及解决方法。 下面是部分页面代码&#xff0c;这里我使用了<img :src"itemc.headUrl" />来动态加载图片 这时遇到了问题&#xff0c;因为这里的itemc.headUrl是图片的相对路径&#xff…

戴尔电脑怎么关闭开机密码?

1.同时按键盘上是“window键”&#xff08;一般是键盘最下面一排第二个&#xff09;和“R键“&#xff0c;并在弹出的窗口输入“netplwiz”然后确定。 2.然后会弹出的“用户账户”窗口&#xff0c;接下来取消勾选“要使用本计算机&#xff0c;用户必须输入用户名和密码” 3.上面…

RK3568 学习笔记 : 更改 u-boot spl 中的 emmc 的启动次序

环境 开发板&#xff1a; 【正点原子】 的 RK3568 开发板 ATK-DLRK3568 u-boot 版本&#xff1a;来自 【正点原子】 的 RK3568 开发板 Linux SDK&#xff0c;单独复制出来一份&#xff0c;手动编译 编译环境&#xff1a;VMware 虚拟机 ubuntu 20.04 问题描述 RK3568 默认 …

Automated CNN approach

图1有点简单 作者未提供代码

Linux 内核设备树 ranges属性

今天有人问了我一下ranges属性&#xff0c;找了相关资料确认后&#xff0c;记录一下&#xff1a; 参考资料链接&#xff1a;让你完全理解linux内核设备树ranges属性地址转换 - vkang - 博客园 (cnblogs.com) ranges属性定义如下&#xff1a; ranges < local_address pa…

学习笔记:Vue3(图片明天处理)

文章目录 1.概述1.1定义1.2特性1.3组合式API 2.基本用例-项目搭建3.项目目录介绍3.1概述3.2查看文件 4.组合式API4.1概述4.2新的API风格4.2.1概述4.2.2写法4.2.3基本用例-Setup选项使用4.2.4基本用例-语法糖写法&#xff08;重点&#xff09;4.2.5执行时机4.2.6代码特点 4.3响应…