理解排序算法:冒泡排序、选择排序与归并排序

news2024/9/20 14:49:44

简介: 在计算机科学中,排序算法是基础且重要的概念。本文将介绍三种常见的排序方法:冒泡排序、选择排序和归并排序。我们将探讨它们的工作原理、特点和适用场景,以帮助读者更好地理解和选择合适的排序方法。

冒泡排序 

冒泡排序是一种简单的排序算法。它通过重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。这个过程重复进行,直到没有再需要交换的元素,此时数列已经排序完成。冒泡排序的特点是实现简单,但效率较低,特别是在处理大数据集时。

 

 

void BubbleSort(int* a, int n)//使用bool来进阶冒泡 ,当有一层不交换,就代表已经排完序,防止永久时间复杂度都是O(n^2)
{
	for (int j = 0; j < n; j++)
	{
		bool exange = false;
		for (int i = 1; i < n - j; i++)
		{
			if (a[i - 1] > a[i])
			{
				Swap(&a[i - 1], &a[i]);
				exange = true;
			}
		}
		if (exange == false)
			break;
	}

}

 冒泡排序的特性总结:

1. 冒泡排序是一种非常容易理解的排序

2. 时间复杂度:O(N^2)

3. 空间复杂度:O(1)

4. 稳定性:稳定

选择排序

 

选择排序是一种简单直观的排序算法,广泛应用于计算机科学教学和一些基础编程任务中。本文将详细介绍选择排序的工作原理、具体实现步骤、算法特点以及适用场景,帮助读者更好地理解和使用这种排序方法。

一、选择排序的工作原理

选择排序算法的基本思想是:

首先在未排序的序列中找到最小(或最大)的元素,然后将其放置在序列的起始位置,接着再从剩余未排序的元素中继续寻找最小(或最大)的元素,然后放到已排序序列的末尾。这个过程一直重复,直到所有元素都被排序。

二、选择排序的步骤

  1. 从未排序的序列中找到最小(或最大)的元素。
  2. 将找到的最小(或最大)元素与序列的第一个元素交换位置(如果最小元素就是第一个元素,则自身和自身交换)。
  3. 重复上述过程,每次交换后,排序序列的长度就增加一个元素,而未排序序列的长度减少一个元素。
  4. 当未排序序列的长度减少到0时,排序就完成了。

三、选择排序的特点

  • 简单直观:选择排序的算法逻辑简单,易于理解和实现。
  • 时间复杂度:在最好、最坏和平均情况下,时间复杂度都是O(n²)。
  • 不稳定排序:选择排序不是稳定的排序算法,相等的元素可能在排序过程中改变其原有的顺序。
  • 原地排序:选择排序不需要额外的存储空间,它是一种原地排序算法。

四、选择排序的适用场景

由于选择排序的效率较低,它通常不适用于数据量较大的排序任务。然而,在数据量较小或者对算法的时间复杂度要求不高的场景中,选择排序由于其实现的简单性,仍然是一个不错的选择。特别是在教学和学习算法的过程中,选择排序是理解基本排序概念的良好起点。

总结: 选择排序以其简单直观的特点,在编程教学和小规模数据处理中有着一席之地。虽然在处理大量数据时效率不高,但它作为基础排序算法,对于理解更复杂的排序技术提供了重要的基础。

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

 归并排序

 

 

简介: 归并排序是一种高效且稳定的排序算法,通过分治法实现对数据的高效排序。本文旨在详细介绍归并排序的工作原理、具体实现步骤、算法的特点以及适用场景,帮助读者深入理解并有效地应用这种排序方法。

一、归并排序的工作原理

归并排序的核心思想是将两个有序的数组合并成一个更大的有序数组。具体来说,它将原始数组分成两半,分别对这两半进行排序,然后将排序好的两个半部分合并在一起。这个过程是递归进行的,最终达到完全排序的目的。

二、归并排序的步骤

  1. 分解:将原始数组分解成两个大小大致相等的子数组。
  2. 解决:递归地对这两个子数组进行归并排序。
  3. 合并:将两个已排序的子数组合并成一个单一的已排序数组。

三、归并排序的特点

  • 高效稳定:归并排序在最坏、最好和平均情况下的时间复杂度均为O(n log n),是一种非常高效的排序算法。同时,它也是一种稳定的排序,即相等的元素在排序后会保持其原有顺序。
  • 分治策略:归并排序是分治法思想的典型应用,通过将问题分解为可管理的子问题来简化复杂性。
  • 额外空间需求:归并排序需要额外的空间来存储临时数组,这是它的一个缺点。

四、归并排序的适用场景

归并排序非常适合处理大数据集,特别是在数据无法一次性装入内存时。由于其稳定性和高效性,它广泛应用于数据库和文件系统等领域,是处理大规模数据排序的理想选择。

总结: 归并排序以其高效、稳定的特性,在大数据处理和复杂系统中占有重要位置。尽管需要额外的存储空间,但其优越的性能使其成为解决复杂排序问题的强大工具。

void _MergeSort(int* a, int begin, int end, int* tmp)//每次需要开辟数组且要对数组进行分区,所以调用子函数
{
	int mid = (begin + end) / 2;
	//[begin , mid] [mid +1, end]
	_MergeSort(a, begin, mid, tmp);
	_MergeSort(a, mid + 1, end, tmp);
	//后序逻辑 归并
	int begin1 = begin, end1 = mid;
	int begin2 = mid + 1, end2 = end;
	int i = begin;
	
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (a[begin1] < a[begin2])
		{
			tmp[i++] = a[begin1++];
		}
		else
		{
			tmp[i++] = a[begin2++];
		}
	}
		while (begin1 <= end1)
		{
			tmp[i++] = a[begin1++];
		}
		while (begin2 <= end2)
		{
			tmp[i++] = a[begin2++];
		}

		memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1));

}
void MergeSort(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
		perror("malloc fail");
		return;
	}
	_MergeSort(a, 0, n - 1, tmp);
	free(tmp);
}

 

总结: 在本系列博客文章中,我们深入探讨了三种经典的排序算法:冒泡排序、选择排序和归并排序。每种排序方法都有其独特的工作原理和应用场景,从简单直观的冒泡排序和选择排序到高效稳定的归并排序,这些算法为我们提供了不同的数据组织和处理方式。

冒泡排序以其实现的简单性和直观性而闻名,适合用于小数据集和教学目的。选择排序,尽管时间复杂度较高,但在需要减少交换次数的情况下仍是一个不错的选择。归并排序则以其高效率和稳定性在大数据处理中发挥重要作用,尤其适用于无法一次性装入内存的大规模数据集。

理解这些排序算法的原理和特点对于任何涉及数据处理的程序员来说都是至关重要的。它们不仅是计算机科学的基础,也是解决实际问题的强大工具。我们希望这些文章能够帮助读者更好地理解这些基本算法,并在适当的场合中作出恰当的选择。

感谢您阅读本系列关于排序算法的探索。我们期待在未来的文章中继续为您提供更多有价值的技术洞见和实用建议。

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

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

相关文章

如何通过上下滑动实现亮度和音量调节(ArkUI)

场景说明 在音视频应用中通常可以通过上下滑动来调节屏幕亮度和音量大小&#xff0c;本例即为大家介绍如何实现上述UI效果。 说明&#xff1a; 由于当前亮度和音量调节功能仅对系统应用开发&#xff0c;所以本例仅讲解UI效果的实现。 效果呈现 本例效果如下&#xff1a; 当在…

Python 进阶(十五):Base64 编码和解码(base64 模块)

大家好&#xff0c;我是水滴~~ 本篇文章主要介绍Python的base64模块&#xff0c;主要内容有&#xff1a;Base64的概念、base64模块、base64编码和解码、以及其使用场景。文章中包含大量的示例代码&#xff0c;希望能够帮助新手同学快速入门。 《Python入门核心技术》专栏总目录…

SpringBoot程序的打包与运行

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

什么是接口与API接口!

今天有个朋友问我什么接口&#xff1f;你们平时都说在写接口&#xff0c;写的是什么鬼啊&#xff1f;我一开始就想&#xff0c;咦小陈同学怎么突然了解编程接口了&#xff0c;不过听到他后一个提问我知道原来他想的是API接口&#xff0c;不过被我主观意识习惯想成了编程定义上的…

HCIA-H12-811题目解析(7)

1、【多选题】RSTP协议包含以下哪些端口状态&#xff1f; 2、【单选题】当采用LACP模式进行链路聚合时华为交换机的默认系统优先级是&#xff1f; 3、【单选题】下面关于二层以太网交换机的描述说法不正确的是&#xff1f; 4、【单选题】以下哪种类型的ACL不能匹配网络层信息…

mysql,树形结构表中,查询所有末节点数据(叶子结点)

需求&#xff1a;在一个可以存放多级目录的表中&#xff0c;查询出某个课程目录下所有末节点&#xff08;因为只有末节点可以挂载资源&#xff09; 例如下图&#xff1a; 其中 1.11.2.12.1 都是末节点&#xff0c;因为他们已经没有下一级了 catalog表中重要字段有&#xff1a;c…

工具应用:Robot Framework->对协议级接口进行测试

实验简介 本节实验主要为大家讲解如何利用Robot Framework结合常用的关键字完成对Agileone系统中的“需求提案”模块进行协议级接口的自动化测试脚本开发。 实验目的 &#xff08;1&#xff09; 掌握RF的Requests库的常用关键字及用法。 &#xff08;2&#xff09; 能够熟练…

成都工业学院Web技术基础(WEB)实验六:ECMAScript基础语法

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考&#xff0c;前端变化比较大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一样 3、图片和文字仅为示例&#xff0c;需要自行替换 4、如果代码不满足你的要求&#xff0c;请寻求其他的…

使用kubeadm部署一套Kubernetes v1.23.0集群

使用kubeadm部署一套Kubernetes v1.23.0集群 1、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式&#xff1a; • kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部…

cobalt strike基础使用

coblat strike使用 服务搭建 首先将server端文件放进kali中 对其赋权 执行时需要root权限 设置ip 启动服务 ./teamserver 10.4.7.138 123456回到win11启动cs&#xff0c;输入刚才配置的信息 上线方式 木马&#xff08;exe上线&#xff09; 查看一下开放的端口 添加监听 …

Python 进阶(十六):二进制和ASCII码的转换(binascii 模块)

大家好&#xff0c;我是水滴~~ 本文详细介绍了Python中的binascii模块及其使用方法。通过binascii模块&#xff0c;我们可以方便地进行二进制和ASCII字符串之间的转换操作。文章中包含大量的示例代码&#xff0c;希望能够帮助新手同学快速入门。 《Python入门核心技术》专栏总…

【web安全】逻辑越权漏洞

前言 菜某分享&#xff0c;有误请指正 越权漏洞功能 顾名思义&#xff0c;他能使用别的用户的权力。我们网站有许多用户&#xff0c;有普通用户&#xff0c;管理员&#xff0c;最高级的管理员等多种账户。这个越权漏洞就是指我们可以行使别的用户的权力。 越权漏洞的分类 …

Knowledge Graph知识图谱—9. Data Quality and Linking

9. Data Quality and Linking 9.1 How well are the linked open data in practice? Linked Open Vocabularies(LOV) project – analyze usage of vocabularies 9.2 Quality Linked Data Conformance vs. Quality Conformance: – i.e., following standards and best prac…

归并排序的实现

一.思想 归并排序是一种基于分治思想的经典排序算法。其主要思想可以总结为以下几个步骤&#xff1a; 分解&#xff08;Divide&#xff09;&#xff1a; 将原始序列划分为若干子序列&#xff0c;直到每个子序列包含一个或零个元素&#xff0c;即认为这些子序列是有序的。 解决…

mmpi量表在各企事业单位 入职体检中的应用

mmpi量表主要应用在医院精神科门诊中&#xff0c;用来检测筛查精神类疾病&#xff0c;比如&#xff1a;焦虑抑郁&#xff0c;疑病妄想强迫性、精神分裂、精神病态、社会内向性、癔症&#xff0c;精神衰弱&#xff0c;躁狂等等。 民航&#xff0c;司法&#xff0c;军警&#xf…

HTML面试题---专题一

文章目录 一、前言二、 HTML5 中 <header> 和 <footer> 标签的用途是什么&#xff1f;三、如何在 HTML 中嵌入 SVG&#xff08;可缩放矢量图形&#xff09;文件&#xff1f;四、解释 contenteditable 属性的用途五、如何创建随屏幕尺寸缩放的响应式图像&#xff1f…

Java接入微信支付详细教程——提供资料

目录 1 前提 2 准备环境 2.1 基本依赖 2.2 准备配置 2.3 测试环境 3 交易类型说明 4 使用 支付下单 支付通知 查询支付 取消支付 申请退款 退款通知 查询退款 5 前端页面 6 前后端联调 6.1 点击支付 6.2 支付通知 6.3 查询支付 6.4 退款 说明&#xff1a;微…

【性能测试】Jmeter 配置元件(一):计数器

Jmeter 配置元件&#xff08;一&#xff09;&#xff1a;计数器 在 Jmeter 中&#xff0c;通过函数 ${__counter(,)} 可以实现每次加 1 1 1 的计数效果。但如果步长不为 1 1 1&#xff0c;则要利用到我们的计数器。 函数作用${__counter(,)}计数器&#xff0c;每次加 1${__d…

jmeter不精通?来看这套很全的jmeter教程,ant批量执行Jmeter脚本

JDK&#xff0c;Jmeter默认已经装了ANT下载&#xff1a;Apache Ant - Binary Distributions ant环境变量需要配置 ant_home&#xff0c;你解压之后的地址 然后PATH环境变量里加上bin目录&#xff0c;D:\work\apache_ant\bin 最后打开命令行窗口&#xff0c;输入 ant -v&…

湖南大学-电路与电子学-2021期末A卷★(不含解析)

【写在前面】 电路与电子学好像是从2020级开设的课程&#xff0c;故实际上目前只有2020与2021两个年级考过期末考试。 本份卷子的参考性很高&#xff0c;这是2020级的期末考卷。题目都是很典型的&#xff0c;每一道题都值得仔细研究透。 特别注意&#xff1a;看得懂答案跟写得…