排序算法合集(1)

news2025/1/17 23:07:57

前言:

今天我们正式开始讲述算法中的排序。排序算法是我们十分重要的算法,为什么呢?

排序是在各种情况下都非常重要的,无论是在人类社会还是在计算机科学中。以下是一些排序的重要性:

  1. 数据分析:在数据分析中,对数据进行排序可以帮助我们更好地理解数据。例如,对销售数据按照时间顺序进行排序可以帮助我们了解产品销售的趋势。

  2. 搜索算法:在搜索算法中,排序可以帮助我们快速地找到需要的信息。例如,在搜索引擎中,对搜索结果按照相关性进行排序可以使用户更容易找到他们需要的信息。

  3. 数据库查询:在数据库查询中,对查询结果进行排序可以让我们更容易地查找特定的数据。例如,在一个包含大量客户信息的数据库中,对客户按照字母顺序进行排序可以让我们更轻松地查找特定客户的信息。

  4. 算法实现:在算法实现中,排序是一项基本的操作。例如,在许多排序算法中,我们需要对数据进行排序才能正确实现算法。

  5. 社交网络:在社交网络中,排序可以帮助我们更好地了解我们的朋友和关注者。例如,在Twitter中,对推文按照时间顺序进行排序可以让我们看到最新的内容。

总之,排序是在许多领域中都非常重要的操作,它可以帮助我们更好地理解和利用数据,提高我们的工作效率,以及实现各种算法和应用程序。

了解完排序算法的重要性,我们就来看看排序算法有哪些

  1. 冒泡排序(Bubble Sort)
  2. 选择排序(Selection Sort)
  3. 插入排序(Insertion Sort)
  4. 希尔排序(Shell Sort)
  5. 归并排序(Merge Sort)
  6. 快速排序(Quick Sort)
  7. 堆排序(Heap Sort)
  8. 计数排序(Counting Sort)
  9. 桶排序(Bucket Sort)
  10. 基数排序(Radix Sort)
  11. 拓扑排序(Topological Sort)
  12. 鸽巢排序(Pigeonhole Sort)
  13. 混合排序(Hybrid Sort)
  14. 推排序(Push Sort)
  15. 二叉树排序(Binary Tree Sort)
  16. 荷兰国旗排序(Dutch National Flag Sort)
  17. 优先队列排序(Priority Queue Sort)
  18. 外部排序(External Sort)
  19. 并行排序(Parallel Sort)
  20. 海量数据排序(Sort Big Data)

了解完排序算法的种类,我们就正式开始介绍今天要讲述的排序算法叭~

冒泡排序(Bubble Sort)

冒泡排序,就是它排序的过程就像冒泡泡一样,气泡从深处冒出水面,气泡会越来越大。

它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就交换位置,直到没有任何一对数字需要比较为止。

其实它的实现过程也十分简单

  1. 比较相邻的两个元素,如果前一个元素比后一个元素大,则交换这两个元素的位置;
  2. 对每一对相邻的元素做同样的工作,从开始第一对到结尾的最后一对,这样一次遍历后,序列中最后一个元素一定是序列中的最大元素;
  3. 针对所有的元素重复以上的步骤,除了最后一个;
  4. 重复步骤 1~3,直到排序完成。

给大家看一下它的动图:

看完动图,会不会觉得形象了不少呢?

那么根据上述的实现过程,就开始写代码叭

//交换函数
void Swap(int* x1, int* x2)
{
	int tmp = *x1;
	*x1 = *x2;
	*x2 = tmp;
}

//冒泡排序的实现
void BubbleSort(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 1; j < n - i; j++)
		{
			if (a[j - 1] > a[j])
			{
				Swap(&(a[j - 1]), &(a[j]));
			}
		}
	}
}

选择排序(Selection Sort)

选择排序,顾名思义,选择一个符合要求的数据放到指定的位置。它的基本思想是每次从未排序的数列中选出最小(或最大)的一个数,将其放在数列的起始位置,直到所有的数被排序完成为止。

它的实现过程也是十分的简单

  1. 从数列中找到最小(或最大)的数,将其放在数列的起始位置。
  2. 从剩余的未排序数列中找到最小(或最大)的数,将其放在已排序数列的末尾。
  3. 重复步骤2,直到所有的数被排序完成。

看完动图,马上就来完成代码

void SelectSort(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		int max = a[i];
		for (int j = i+1; j < n; j++)
		{
			if (a[j] > max)
			{
				max = a[j];
			}
		}
	}
}

 选择排序的核心思想是在未排序的数列中找到最小(或最大)的数,这个过程可以通过遍历数列来实现。具体来说,我们可以使用两个指针,一个指向已排序数列的末尾,一个指向未排序数列的起始位置,每次遍历未排序数列,找到最小(或最大)的数,将其与已排序数列的末尾交换位置。

插入排序(Insertion Sort)

说到插入排序,一定能想到斗地主的时候,拿着牌之后插到指定的位置,这个就是插入排序。将未排序的数列插入到已排序的数列中,使得插入后的数列仍然有序。

具体实现如下:

  1. 将数列分为已排序和未排序两部分,初始时已排序部分只包含第一个元素,未排序部分包含除第一个元素以外的所有元素。
  2. 从未排序部分中取出一个元素,将其插入到已排序部分中的适当位置,使得插入后的数列仍然有序。
  3. 重复步骤2,直到所有的数被排序完成。

 

代码实现:

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

插入排序的核心思想是将未排序的数列插入到已排序的数列中,这个过程可以通过遍历数列来实现。具体来说,我们可以使用一个指针指向未排序部分的第一个元素,然后将其插入到已排序部分中的适当位置。为了找到插入位置,我们可以从已排序部分的末尾开始遍历,依次比较已排序部分的元素和未排序部分的元素,直到找到一个比未排序元素小的元素,将未排序元素插入到这个元素的后面。

希尔排序(Shell Sort)

这个排序与上面的插入排序十分相似,甚至可以说一模一样,只不过这个排序能快速的把大的数放到后面去,而不是插入排序慢慢的一个一个的插入。它的创新之处在于引入了增量序列的概念,通过将数列划分为若干个子序列,对每个子序列进行插入排序,使得整个数列逐步变得有序,从而提高了排序的效率。

希尔排序的核心思想是将数列划分为若干个子序列,对每个子序列进行插入排序,使得整个数列逐步变得有序。

具体实现如下:

  1. 选择一个增量序列,将数列划分为若干个子序列,每个子序列包含相邻的若干个元素,其中相邻元素之间的距离为增量序列中的一个数。
  2. 对每个子序列进行插入排序,使得整个数列逐步变得有序。
  3. 重复步骤1和步骤2,直到增量序列中的最后一个数为1,即对整个数列进行插入排序。

还是先来看动图

 

代码实现:

void ShellSort(int* arr, int n)
{
	int gap;
	int i = 0;
	int j = 0;
	int temp = 0;
	for (int gap = n / 2; gap > 0; gap /= 2)
	{
		{
			for (i = gap; i < n; i++)
			{
				temp = arr[i];
				for (j = i; j >= gap && arr[j - gap] > temp; j -= gap)
				{
					arr[j] = arr[j - gap];
				}
				arr[j] = temp;
				}
		}
	}

}

 

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

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

相关文章

多连接数据库管理Navicat Premium 中文

Navicat Premium 是一款强大的数据库管理工具&#xff0c;它支持多种关系型数据库&#xff0c;包括 MySQL、MariaDB、Oracle、SQL Server、PostgreSQL 等等。 以下是 Navicat Premium 的一些主要功能&#xff1a; 连接管理&#xff1a;可以在一个用户界面中同时连接到多个数据库…

HCIP-6.7BGP的路径选择

BGP的路径选择 1、BGP路径属性1.1、路由选择1.1.1、BGP路由选择过程1.1.2、BGP选路参数2、BGP的路由策略2.1、Preferred-Value相当权重weight2.2、local-preference本地优先级2.3、AS_PATH经过的AS号 不常用2.4、Origin起源属性修改2.5、MED多出口鉴别器3、BGP非策略性选路原则…

【C++】右值引用(极详细版)

在讲右值引用之前&#xff0c;我们要了解什么是右值&#xff1f;那提到右值&#xff0c;就会想到左值&#xff0c;那左值又是什么呢&#xff1f; 我们接下来一起学习&#xff01; 目录 1.左值引用和右值引用 1.左值和右值的概念 2.左值引用和右值引用的概念 2.左值引用和右…

C++linux高并发服务器项目实践 day2

Clinux高并发服务器项目实践 day2 静态库的制作静态库命名规则静态库的制作 动态库的制作命名规则制作使用动态库与静态库的区别解决动态库连接失败问题静态库和动态库的对比静态库的优缺点动态库的优缺点 Makefile什么是MakefileMakefile文件命名和规则Makefile的使用工作原理…

SpringSpringBoot常用注解总结

0.前言 可以毫不夸张地说&#xff0c;这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景。对于每一个注解我都说了具体用法&#xff0c;掌握搞懂&#xff0c;使用 SpringBoot 来开发项目基本没啥大问题了&#xff01; 为什么要写这篇文章…

【分享】Excel表格的密码忘记了怎么办?附解决办法

我们知道通过设置密码可以保护Excel表格&#xff0c;可有时候设置后很久没用就把密码忘记了&#xff0c;而Excel并没有找回密码的选项&#xff0c;那要怎么办呢&#xff1f;今天小编就来分享一下忘记Excel密码的解决方法。 Excel表格可以设置多种密码&#xff0c;不同密码对应…

短视频平台-小说推文(Lofter)推广任务详情

​Lofter日结内测中&#xff0c;可能暂只对部分优质会员开放! 注意 Lofter 关键词7天未使用&#xff0c;可能会被下线。 Lofter 不再需要回填视频链接了。 接Lofter官方通知 关于近期部分博主反馈播放量高但搜索量很低的问题尤其是快手平台&#xff0c;我们做了代码、服务器…

No.040<软考>《(高项)备考大全》【第24章】成熟度模型

【第24章】成熟度模型 1 考试相关2 第一维四个阶梯3 项目成熟度模型OPM3CMMI过程域 4 成熟度级别级别区别 5 练习题参考答案&#xff1a; 1 考试相关 选择可能考0-1分&#xff0c;案例论文不考。 2 第一维四个阶梯 3 项目成熟度模型OPM3 CMMI过程域 CMMI过程域可以分为4类&a…

智能对话机器人Rasa学习资料

文章目录 背景收集的Rasa学习资料官网B站其他 类似产品教学机器人售后咨询效果手机推荐效果 背景 最近做了一个Ros2项目&#xff0c;界面如下图&#xff1a; 客户要求能够使用语音快速执行特定动作如:打开视频窗口、显示小车1视频、无人机1返航等&#xff0c;这就涉及到了自然…

C++ : 整体工程构架设计流程

重点&#xff1a; 1.一个项目通常分为bin(存放项目生成的dll和整体工程的exe)&#xff0c;code(存每个项目的代码)&#xff0c;lib(存每个项目生成的lib),pdb(存放项目生成的pdb文件)&#xff0c;sln(解决方案) 整体创建流程&#xff1a; 一个主干项目&#xff0c;其他若干依赖…

Java接口自动化测试框架系列:提升测试效率的自动化测试框架

目录&#xff1a;导读 一、什么是自动化测试 二、自动化测试的缺点 三、自动化测试框架选型 原则 对比 四、框架构建 【自动化测试工程师学习路线】 一、什么是自动化测试 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。 通常&#xff0c;在设计了测试…

【UE】暂停游戏界面及功能实现

效果 步骤 1. 首先在项目设置中添加一个暂停的操作映射 2. 新建一个控件蓝图&#xff0c;命名为“PauseMenuWidget” 3. 打开“ThirdPersonCharacter”&#xff0c;添加一个布尔类型变量&#xff0c;命名为“isScreenShow”&#xff0c;用于判断当前玩家是否打开了暂停界面 在…

【Linxu网络服务】DHCP

DHCP 一、DHCP工作原理1.1背景1.2优点1.3 DHCP分配方式1.4DHCP工作原理 二、使用DHCP动态配置主机地址2.1实验一&#xff1a;动态配置主机地址2.2给Linux客户机配置动态地址**2.4设置一个外网口&#xff0c;给客户端设置一个固定的ip地址 一、DHCP工作原理 作为服务端负责集中…

uniapp 之 将marker 渲染在地图上 点击弹层文字时显示当前信息

目录 效果图 总代码 分析 1.template 页面 地图显示代码 2. onload ①经纬度 ②取值 ③注意 ④ 3.methods ① 先发送 getStationList 请求 获取 数组列表信息 ② regionChange 视野发生变化时 触发 分页逻辑 ③ callouttap 点击气泡时触发 查找 当前 marker id 等…

基于第一性原理DFT密度泛函理论的计算项目

随着计算机技术的不断发展&#xff0c;计算材料科学的方法也日益成熟。其中&#xff0c;基于第一性原理的密度泛函理论&#xff08;DFT&#xff09;计算方法&#xff0c;因其准确性、可靠性和高效性而广受欢迎。本文将介绍基于DFT的密度泛函理论的计算项目&#xff0c;包括电子…

云内基于 SRv6 的 SFC 方案

1. 基于 SRv6 的 SFC 服务链 为满足用户的业务数据安全、稳定等需求&#xff0c;提供各种基础保障或增值优化服务&#xff0c;在传统网络中&#xff0c;经常使用业务功能节点&#xff08;如负载均衡、防火墙等&#xff09;实现服务供应。但这些业务功能节点往往与网络拓扑和硬件…

Fortinet Accelerate 2023全球网安大会成功举办 加速推进网络安全行业融合与整合

近日&#xff0c;Fortinet全球网络安全大会——Fortinet Accelerate 2023 在美国奥兰多成功举办。在对企业数字化转型挑战及网络威胁趋势等行业热点进行深入探讨的同时&#xff0c;Fortinet全新发布了以融合与整合为核心设计理念的增强型产品和服务&#xff0c;帮助企业从容应对…

第2章 时间空间复杂度计算

1时间复杂度计算 时间复杂度是什么&#xff1f; 一个函数&#xff0c;用大O表示&#xff0c;例如&#xff1a;O(1), O(N), O(logN). 定性描述算法的运行时间。 时间复杂度常见图&#xff1a; 案例&#xff1a; O(1) let i 0 i 1 解释&#xff1a;每次执行这段代码&#…

【Paper Note】Video Swin Transformer

Video Swin Transformer 介绍架构3.2 3D Shifted Window based MSA Module3.2.1 在不重叠的三维窗口上的MSA3.2.2 3D Shifted Windows3.2.3. 3D Relative Position Bias 3.3 Architecture Variants3.4 Initialization from Pre-trained Model 总结 文章链接&#xff1a;https:/…

zabbix自动发现和自动注册部署

目录 zabbix自动发现 确保客户端上的zabbix-agent2服务状态正常 在web页面删除原有的客户端主机 在服务端和客户端上配置 hosts 解析 在 Web 页面配置自动发现 zabbix自动注册 环境准备 修改 zabbix-agent2 配置文件 在 Web 页面配置自动注册 zabbix自动发现 对于agen…