数据结构——冒泡、选择、插入和希尔排序

news2024/11/15 13:53:33

目录

引言

冒泡排序

1.算法思想

2.算法步骤

3.代码实现

4.复杂度分析

选择排序

1.算法思想

2.算法步骤

3.代码实现

(1)优化前

(2)优化后

4.复杂度分析

插入排序

1.算法思想

2.算法步骤

3.代码实现

4.复杂度分析

希尔排序

1.算法思想

2.算法步骤

3.代码实现

4.复杂度分析

结束语


引言

在数据处理、算法优化等领域中,排序是基础且关键的一环。本文将要探讨的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序

求点赞收藏关注!!!

冒泡排序

1.算法思想

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素为止,这意味着数列已经排序完成。

这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端(或底部)。

2.算法步骤

1.比较相邻的元素。如果第一个比第二个大(或小,根据排序顺序要求),就交换它们两个。

2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数(或最小的数)。

3.针对所有的元素重复以上的步骤,除了已完成排序元素。

4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

注意:如果一轮之后,元素并没有发生任何交换,此时说明此时排序已经完成,那么我们可以提前结束循环。

我们来看个动图就能很直观的理解什么是冒泡排序:

3.代码实现

void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

void bubble_sort(int arr[], int sz)
{
	// 外层循环,控制排序的轮数
	for (int i = 0; i < sz - 1; i++)
	{
		// 定义一个标志位,用于判断是否在这一轮中有元素交换
		int flag = 0;
		// 内层循环,进行实际的元素比较和交换
		for (int j = 0; j < sz - i - 1; j++)
		{
			// 如果当前元素大于后一个元素,则交换它们
			if (arr[j] > arr[j + 1])
			{
				// 设置标志位为1,表示发生了交换
				flag = 1;
				Swap(&arr[j], &arr[j + 1]);
			}
		}
		// 如果这一轮没有发生任何交换
		// 说明数组已经有序,可以提前结束排序
		if (flag == 0)
		{
			break;
		}
	}
}

4.复杂度分析

时间复杂度:最坏情况是数组完全逆序,此时每一轮都需要进行 n - 1 次比较,并且每一轮都会进行至少一次交换.因此,总的比较次数和交换次数都接近 n (n - 1) / 2,其中 n 是数组的长度。所以,最坏情况下的时间复杂度是 O(n ^ 2) 。

空间复杂度:由于没有开辟额外的空间大小,因此空间复杂度为O(1)。

选择排序

1.算法思想

选择排序(Selection Sort)是一种简单直观的排序算法。通过不断选择剩余元素之中的最小(或最大)元素,然后与起始位置的元素交换(起始位置在每一次选择后都向后移动一位),直到整个序列排序完成。

2.算法步骤

1.在未排序序列中找到最小(大)元素。遍历未排序的数组,找到最小(或最大)的元素。

2.存放到排序序列的起始位置。将找到的最小(或最大)元素与未排序序列的第一个元素交换位置(如果第一个元素就是最小(大)元素,则它自己和自己交换)。

3.从剩余未排序元素中继续寻找:在剩下的未排序元素中继续执行步骤1和步骤2,直到所有元素都被排序。

 看动图直观的感受一下:

3.代码实现

(1)优化前
void SelectSort(int* arr, int len)
{
	for (int i = 0; i < len - 1; i++)
	{
        // 假设当前位置i的元素是最小的,记录其索引为mini
		int mini = i;
		for (int j = i + 1; j < len; j++)
		{
            // 如果发现更小的元素,则更新mini为当前更小元素的索引
			if (arr[j] < arr[mini])
			{
				mini = j;
			}
		}
		swap(&arr[mini], &arr[i]);
	}
}
(2)优化后

我们可以对上面的代码进行点优化,我们可以同时选择最大与最小的元素,同时往起始与结尾位置交换。

注意:同时交换可能会改变原先最大或者最小元素的位置。因此我们需要进行判断。

代码如下:

//交换两个数据
void Swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

void SelectSort(int* arr, int n)
{
	int begin = 0;		// 未排序部分的起始索引
	int end = n - 1;	// 未排序部分的结束索引
	while (begin < end)
	{
		int maxi = begin;
		int mini = begin;
		// 遍历未排序部分,找到最小值和最大值
		for (int i = begin + 1; i <= end; i++)
		{
			if (arr[i] < arr[mini])
			{
				mini = i;	// 更新最小值的位置
			}
			if (arr[i] > arr[maxi])
			{
				maxi = i;	// 更新最大值的位置
			}
		}
		// 将当前范围的最小值交换到未排序部分的开始位置
		Swap(&arr[begin], &arr[mini]);

		// 如果begin与maxi重合,则更新maxi
		if (maxi == begin)
		{
			maxi = mini;
		}
		// 将当前范围的最大值交换到未排序部分的结束位置
		Swap(&arr[end], &arr[maxi]);

		// 缩小未排序部分的范围
		++begin;
		--end;
	}
}

4.复杂度分析

时间复杂度:由于每次外层循环中的内层循环需要遍历几乎所有未排序的元素,因此时间复杂度为O(n^2)。

空间复杂度:由于没有开辟额外的空间大小,因此空间复杂度为O(1)。

插入排序

1.算法思想

插入排序(Insertion Sort)是一种简单直观的排序算法。它模拟了我们日常生活中整理扑克牌或排序书籍的过程。其基本思想是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、元素个数加一的有序数据,直到全部待排序的数据元素插完,排序完成。

2.算法步骤

1.将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

2.遍历未排序部分,将扫描到的每个元素插入有序序列的适当位置。

3.依次重复1,2步骤,直至插入完成。

 动图演示如下:

3.代码实现

void InsertSort(int* arr, int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		int end = i;
		// tmp 存储当前需要插入的元素的值
		int tmp = arr[end + 1];
		// 内层循环,将比 tmp 大的元素向后移动一位
		// 为 tmp 找到正确的插入位置
		while (end >= 0)
		{
			if (arr[end] > tmp)
			{
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
				break;
			}
		}
		// 将 tmp 插入到找到的正确位置
		arr[end + 1] = tmp;
	}
}

4.复杂度分析

时间复杂度:当处于最坏情况时,由于每次插入都会移动数据,因此时间复杂度为O(n^2)。

空间复杂度:由于没有开辟额外的空间大小,因此空间复杂度为O(1)。

希尔排序

1.算法思想

希尔排序(Shell Sort)是插入排序的一种更高效的改进版本,也称为缩小增量排序。基本思想是将待排序的数组元素按照某种增量(gap)进行分组,对每组使用插入排序算法进行排序。随着增量的逐渐减少,每组包含的元素越来越多,当增量减至1时,整个数组被视为一组进行最后的插入排序,从而完成排序过程。

2.算法步骤

1.选择一个增量 gap ,对数据进行分组,每间隔gap个元素分为一组,一共gap组。

2.以gap为基准单位,对其进行插入排序。

3.逐渐缩小gap的范围,直至gap为1,相当于进行一次正常的插入排序。

 动图演示所下所示:

3.代码实现

void ShellSort(int* arr, int n)
{
	// 初始化增量gap为数组长度n,用于分组
	int gap = n;
	while (gap > 1)
	{
		// 逐渐减少增量
		gap = gap / 3 + 1;
		// 对每个分组进行插入排序
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int tmp = arr[end + gap];
			while (end >= 0)
			{
				// 如果当前位置的元素大于tmp
				// 则将当前位置的元素向后移动gap位
				if (arr[end] > tmp)
				{
					arr[end + gap] = arr[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			// 将tmp插入到找到的正确位置
			arr[end + gap] = tmp;
		}
	}
}

4.复杂度分析

时间复杂度:希尔排序的时间复杂度一般较为难计算,通过大量测验一般认为其时间复杂为O(N^1.3)。

空间复杂度:由于没有开辟额外的空间大小,因此空间复杂度为O(1)。

结束语

本篇博客是数据结构——排序 的第一篇。

感谢各位大佬能阅读本文。

求点赞收藏关注!!!十分感谢!!!

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

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

相关文章

智能手机摄影综评:品牌联名与自建影像品牌的战略分析

随着智能手机摄影技术的飞速发展&#xff0c;各大厂商不仅与知名摄影品牌展开合作&#xff0c;还通过自建影像品牌来提升产品的摄影能力和品牌形象。本文将重点分析小米、华为、荣耀、OPPO、Vivo和苹果在摄影品牌联名与自建影像品牌方面的战略&#xff0c;探讨这些策略如何影响…

【第78课】数据库安全RedisCouchDBH2database未授权访问CVE漏洞

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0…

数学基础(七)

一、熵 熵代表物体内部的混乱程度。&#xff08;一件事发生的不确定性&#xff09; 熵应用到分类任务中 二、激活函数 Sigmoid函数&#xff1a; Tanh函数&#xff1a; Relu函数&#xff1a; 三、回归分析 回归分析是寻找存在相关关系的变量间的数学表达式&#xff0c;并进行…

Parallels Desktop 19 for Mac 安装虚拟机需要激活吗

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机&#xff0c;并于其中装设不同的操作系统&#xff0c;如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时&#xff0c;您可在 …

商业预付费电能管理解决方案

安科瑞徐赟杰 商业预付费电能管理解决方案 大型商业项目的能源消耗量高&#xff0c;一般为住宅的10-15倍&#xff0c;普通公共建筑的3-5倍。作为商业地产的物业管理层&#xff0c;希望他们的用电费用回收越快越好&#xff0c;更进一步的可能需要一个简单便捷的收集、并清楚显…

5步掌握Python Django结合K-means算法进行豆瓣书籍可视化分析

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

MAVEN 3.9.1安装

WIN系统MAVEN 3.9.1安装 1. 下载 下载官网地址&#xff1a;Index of /dist/maven/maven-3 (apache.org) 百度网盘&#xff1a; 通过网盘分享的文件&#xff1a;apache-maven-3.9.1-bin.zip 链接: https://pan.baidu.com/s/1VKmxrU5Hg6mbEUc43wjQUw 提取码: aua6 –来自百度网…

Linux云计算 |【第二阶段】SHELL-DAY1

主要内容&#xff1a; Shell概述&#xff0c;编写及执行脚本、Shell变量&#xff08;自定义变量、环境变量、预定义变量、位置变量&#xff09;、数值运算&#xff08;expr工具、$[]、let、bc&#xff09; 一、Shell概述 Shell 是操作系统提供的一种命令行解释器&#xff0c;…

攻防世界-web题型-9星难度汇总-个人wp

TimeKeeper 2024/03/10 16:18 有两周没有打靶场了&#xff0c;这段时间在准备护网的面试&#xff0c;顺便挖了下edu也是挖到了一些漏洞。 言归正传&#xff0c;看看这道题目。进去是一个shop&#xff0c;先注册一个账号尝试注册admin发现操作失败&#xff0c;尝试登录admin …

Unity+Addressable

前期准备 下载一个hfs本地服务器&#xff0c;打开即可 HFS ~ HTTP 文件服务器 (rejetto.com) 1.安装Addressable插件 创建组 2.使用图片创建预制体 放入Addressable Groups内 3.右键 新建组 创建预制体t拖拽放入新建组里 新组命名为Gameobject 简化名称 4.创建一个测试脚本 …

Python和MATLAB梯度下降导图

&#x1f3af;要点 寻找局部最小值普通最小二乘法和随机梯度下降的动量线性回归媒体广告销售光学字符识别和最小化均方误差男女医疗费用最快速下降方向函数优化等高线图可视化共轭梯度下降可视化损失函数、动量、涅斯特洛夫动量、权衰减量化不确定性拓扑结构算法分类中权重归一…

西安电子高速PCB学习(四)

注意了&#xff0c;信号发生器的不同通路不能并联使用&#xff0c;示波器的信号通路不能并联电源使用&#xff0c;不同信号发生器不能并联使用&#xff1a; 严禁多个电容共用过孔&#xff1a; 多个电容并联时&#xff0c;小容量的电容应更靠近芯片电源引脚&#xff0c;主要原因…

【图像增强】使用 Albumentations Python 库(01)

目录 一、说明 二、Albumentations库 2.1 如何安装 2.2 测试代码示例 2.3 在albumentations库中实现的所有像素级变换 2.4 空间级转换 2.5 混合级别转换 三、让我们看看上述实现中的转换。 3.1 在专辑中实现的天气相关转换 3.2 随机雨 3.3 在相册中处理非 8 位图像 3.4 在文档…

如何优雅的实现CRUD,包含微信小程序,API,HTML的表单(一)

前言 在开发实际项目中&#xff0c;其实CRUD的代码量并不小&#xff0c;最近要做一个小程序项目&#xff0c;由于涉及表单的东西比较多&#xff0c;就萌生了一个想法&#xff0c;小程序的写法不是和VUE类似&#xff0c;就是数据绑定&#xff0c;模块么&#xff01;那就来一个动…

【vue3|第26期】Vue3 中的 useRoute 与 router.currentRoute.value:选择正确的路由访问方式

日期&#xff1a;2024年8月22日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉在这里插入代码片得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不…

推荐4款2024年专业的电脑远程控制软件。

为了能够打破空间的限制&#xff0c;远程控制工具被越来越多的人使用。它们可以帮助提高工作效率&#xff0c;方便远程技术支持等。今天&#xff0c;就让我们一起来了解一下网上比较火的4款远程控制电脑的软件。 &#xff11;、向日葵 直达链接&#xff1a;https://down.oray.…

如何使用python脚本爬取微信公众号文章?

1、什么是爬虫&#xff1f; 在座的各位可能经常听到一个词&#xff0c;叫“爬虫”&#xff0c;这是一种能够悄无声息地将网站数据下载至本地设备的程序。利用爬虫&#xff0c;您无需亲自访问特定网站&#xff0c;逐个点击并手动下载所需数据。相反&#xff0c;爬虫能够全自动地…

FL Studio24苹果mac电脑破解绿色版安装包下载

FL Studio 24最新版本&#xff0c;这可不仅仅是一个音乐制作软件的升级&#xff0c;它是音乐创作爱好者的福音&#xff0c;是专业制作人的心头好。那么&#xff0c;它究竟有哪些魔力&#xff0c;能让这么多人为之疯狂呢&#xff1f; 我们来看看它的界面。FL Studio 24的界面设…

XGBoost中正则化的9个超参数

正则化是一种强大的技术,通过防止过拟合来提高模型性能。本文将探索各种XGBoost中的正则化方法及其优势。 为什么正则化在XGBoost中很重要? XGBoost是一种以其在各种机器学习任务中的效率和性能而闻名的强大算法。像任何其他复杂模型一样,它可能会过拟合,特别是在处理噪声数据…

x-cmd mod | x scoop - Windows 开源包管理工具

目录 介绍主要特点例子子命令 介绍 scoop 是 windows 的第三方包管理工具&#xff0c;与 winget, choco, chocolatey 类似。 本模块在 scoop 的基础上做了增强&#xff0c;使其可与 shell 无缝集成&#xff0c;并提供更多的功能。 主要特点 自动下载&#xff1a; 通过调用 S…