【初阶数据结构】冒泡排序和选择排序(用C语言实现,主要讲思维)

news2024/11/21 17:48:00

关注

文章目录

  • 前言
  • 1. 冒泡排序
    • 1.1 算法思想
    • 1.2 冒泡排序的代码实现
    • 1.3 冒泡排序算法的改进
  • 2. 选择排序
    • 2.1 算法思想
    • 2.2 选择排序的代码实现
  • 3. 写排序算法的小技巧

前言

讲到排序相信大家一定对一种排序很熟悉,它的名字就叫做冒泡排序。这个排序大家在学习各种语言时,都是一道绕不去的坎。本文还会介绍另一个比较简单的排序 —— 选择排序,以及给大家讲一下选择排序的另一种写法(但是效率没有发生大的改变)。

本章内容比较简单,主要是讲一下算法的思想,以及给大家总结一下我们在写排序算法时的一些小技巧。

hahah

1. 冒泡排序

在讲冒泡排序的算法之前,先给大家看一个动图,大家可以结合动图的演示理解我下面所讲的话语。
哈哈

1.1 算法思想

这里我们先理解冒泡排序算法的单趟排序思想。这里我们主要讲的是升序排序(降序一样的道理 )。

🍉结合上面的动图,我们可以很清楚的看到,冒泡排序的核心思想就是将数组中相邻的两个数进行比较,如果左边的数比右边的数要大,那它们两个就交换数据,接着继续比较下一组相邻的数据,如果右边的数大于左边的数,那就直接进入比较下一组相邻的数据的环节。一直比较到一组相邻数据中包含了数组末尾的数据,才算是结束。

以上就是冒泡排序单趟排序的思想!

接着我们就得组合多次单趟排序形成一个完整的冒泡排序。

🍉我们可以这么想:冒泡排序单趟排序的目的是为了将待排序数组中的最大值给放到待排序数组的结尾处,紧接着就缩小待排序的区间范围。又得读者可能会问为什么要缩小待排序的区间范围?原因很简单,因为单趟排序的最大数引进放到了正确的位置上了,下一次排序可以不用动它了。这样一来,只要一开始数组有n个元素,我们执行单趟排序的次数就为(n-1)次。

好了,思想讲解完了,下面直接上代码。

1.2 冒泡排序的代码实现

//交换两个数字
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++)
	{
		for (int j = 1; j < n - i; j++)
		{
			if (a[j - 1] > a[j])
			{
				Swap(&a[j - 1], &a[j]);
			}
		}
	}
	
}
//冒泡排序 -- 第二种写法
//交换两个数字
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++)
	{
		for (int j = 0; j < n - i - 1; j++)
		{
			if (a[j] > a[j + 1])
			{
				Swap(&a[j + 1], &a[j]);
			}
		}	
	}
	
}

1.3 冒泡排序算法的改进

大家如果仔细的一点的话可以发现一个问题,如果我给的数组是一个已经有序的数组,它仍会给我进行一次完整的冒泡排序,可以通过以下代码给大家测试一下:
排序算法的改进

可以看到无论我们喂给这个函数什么数组,这个排序的时间复杂度都为O( N 2 N^2 N2)。但是这跟我们的预期是不一样的,因为冒泡排序在排有序数组的时间复杂度应该为O(N)。所以我们该怎么对上面的代码进行优化呢?

优化之后的代码:

//冒泡排序 -- 第二种写法
//交换两个数字
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 flag = 0; //设定一个标志位,又来标明该数组是否有序
		
		for (int j = 1; j < n - i; j++)
		{
			if (a[j - 1] > a[j])
			{
			    flag = 1; //说明数组时无序的
				Swap(&a[j - 1], &a[j]);
			}
		}
		
		if(flag == 0)
		{
			break;
		}
	}
	
}

讲完

可以很清楚的看到,我们的改良大获成功。


2. 选择排序

老规矩(以升序为例),先上动图:
插入排序

2.1 算法思想

选择排序的单趟排序是选择待排序数组中最小的数,将它与待排序数组中的开头的位置的数交换位置。这样单趟排序就完成了。

接下来讲一下完整的选择排序,可以看到的是每当我们完成了一个选择排序算法的单趟排序是将待排序的数组中最小的数放到正确的位置上。直到最后只剩最后一个数字时,排序终止。

2.2 选择排序的代码实现

选择排序算法的第一种写法:

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

选择排序算法的第二种写法:

void SelectSort(int* a, int n)
{
	int left = 0, right = n - 1;
	int maxi = 0, mini = 0;


	while (left < right)
	{
		for (int i = left; i <= right; i++)
		{
			if (a[maxi] < a[i])
			{
				maxi = i;
			}

			if (a[mini] > a[i])
			{
				mini = i;
			}

		}

		Swap(&a[left], &a[mini]);

		if (left == maxi)
		{
			maxi = mini;
		}
		Swap(&a[right], &a[maxi]);

		left++;
		right--;
	}
	
}

上面的写法比较难以理解,如果实在理解不了的话,第一种写法也是可以的。因为这两种写法的效率是差不多的,时间复杂度都为O(N^2)。

3. 写排序算法的小技巧

🍉相信大家在看完每个排序算法的思路讲解时,会发现一个规律:从单趟排序开始分析,在逐步向全局排序进行延伸。核心就在于我们得理解单趟排序的目的是什么,这样才能为我们的全局排序做铺垫。


为此,本文的讲解就到这里了。

如果觉得本文对你有帮助的话,麻烦会给偶点个赞吧!!!

哈哈

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

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

相关文章

【优选算法】(第二十六篇)

目录 两数相加&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 两两交换链表中的节点&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 两数相加&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;…

随着硬件水平的提升,LabVIEW有哪些过去的编程方法被淘汰掉了

随着硬件水平的不断提升&#xff0c;尤其是处理器性能、存储能力、通信速度等方面的飞跃&#xff0c;LabVIEW的一些早期编程方法逐渐被更高效、现代的编程技术所取代。以下是一些随着硬件升级而逐步淘汰的LabVIEW编程方法和技术&#xff1a; 1. 低效的数据流传输方式 过去由于…

SQL执行顺序是如何工作的,为什么它如此重要?

&#x1f3af;SQL执行顺序是如何工作的&#xff0c;为什么它如此重要&#xff1f; SQL查询按照以下顺序执行其语句&#xff1a; 1️⃣FROM / JOIN 2️⃣WHERE 3️⃣GROUP BY 4️⃣HAVING 5️⃣SELECT 6️⃣DISTINCT 7️⃣ORDER BY 8️⃣LIMIT / OFFSET 你在每个步骤中实现的技…

特定类型的图与应用 - 离散数学系列(六)

目录 1. 树和生成树 树的定义 生成树与最小生成树 2. 二分图 二分图的定义 示例&#xff1a;最大匹配问题 3. 欧拉图与哈密顿图 欧拉图 哈密顿图 4. 实际应用场景 1. 文件系统中的树结构 2. 网络优化中的最小生成树 3. 社交网络分析 5. 例题与练习 例题1&#xf…

sv标准研读第十三章-task和function

书接上回&#xff1a; sv标准研读第一章-综述 sv标准研读第二章-标准引用 sv标准研读第三章-设计和验证的building block sv标准研读第四章-时间调度机制 sv标准研读第五章-词法 sv标准研读第六章-数据类型 sv标准研读第七章-聚合数据类型 sv标准研读第八章-class sv标…

【直接原地起飞】3DMAX2025热门插件合集来啦!

强烈推荐8款3DMAX2025热门插件&#xff01; 在3DMAX的广阔世界里&#xff0c;插件如同魔法工具&#xff0c;为设计师们打开了无限创意的大门。今天&#xff0c;我们精心挑选了8款热门插件&#xff0c;它们不仅功能强大&#xff0c;而且易于上手&#xff0c;定能让你的3D设计之旅…

Python从0到100(六十二):机器学习实战-预测波士顿房价

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

增强分析:新时代的数据洞察工具

随着数据科学和人工智能的迅猛发展&#xff0c;分析数据的方式也发生了显著的变化。增强分析&#xff08;Augmented Analytics&#xff09;是近年来涌现出的新概念&#xff0c;它将人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;和自然语言处理&…

操作系统 | 学习笔记 | 王道 | 4.2 目录

4.2 目录 4.2.1 目录的基本概念 文件目录指FCB的有序集合&#xff0c;一个FCB就是一个文件的目录项。与文件管理系统和文件集合相关联的是文件目录&#xff0c;它包含有关文件的属性、位置和所有权等。 目录管理的基本要求&#xff1a; 从用户的角度看&#xff0c;目录在用户…

win11下AMD CPU支持WSL2

除开常规的配置&#xff1a; 1.打开虚拟机 2.打开hyper-v 3.bios启用虚拟机 还需要做如下操作: 管理员方式进入Powershell: bcdedit /set hypervisorlaunchtype auto 成功案例&#xff1a; win11: cpu: amd

00_概览_kafka

kafka 概述kafka版本流程启动zk配置zk启动命令 启动kafka修改server.properties启动命令 kafka脚本-命令行操作命令行创建主题脚本查看主题主题详情修改主题删除主题大量日志解决方案 控制台生产者消费者代码 生产者 消费者kafka-toolkafka数据文件 扩展横向扩展纵向扩展分区消…

【小沐学GIS】QGIS导出OpenStreetMap数据(QuickOSM、OSM)

文章目录 1、简介1.1 OSM1.2 QuickOSM1.3 Overpass Turbo 2、插件安装3、插件使用3.1 快速查询&#xff08;boundary边界&#xff09;3.2 快速查询&#xff08;railway铁路&#xff09;3.3 快速查询&#xff08;boundaryadmin_level行政边界&#xff09;3.4 快速查询&#xff0…

OpenFeign-查询参数-日期格式化:LocalDate、Date、@DateTimeFormat(低版本无效)

创建时间&#xff1a;2024-10-08 本文适用的依赖版本&#xff1a; spring-boot-starter-parent&#xff1a;3.3.3 spring-cloud-starter-openfeign&#xff1a;4.1.3 一、场景 在 REST API 的查询接口中&#xff0c;日期查询参数 的格式一般是标准&#xff08;ISO 8601&#x…

BiGRU-Transformer时间序列预测(多输入单预测)——基于Pytorch框架

1 介绍 本文将介绍一种基于Transformer和BiGRU&#xff08;双向门控循环单元&#xff09;的混合模型及其在时间序列预测中的应用。本模特适用于多输入单输出预测&#xff0c;适合风电预测&#xff0c;功率预测&#xff0c;负荷预测等等。 2 方法 首先&#xff0c;从Excel文件…

常见数据库等保测评检查命令汇总

MySQL数据库 select user, host FROM mysql.user&#xff1b;查看管理用户 show variables like validate%; 查看口令策略 show variables like %password%; 查看口令策略 show variables like %general%; 查看日志是否开启 show variables like general_log%; 可以看查询日…

电磁兼容(EMC):PCB设计里的镜像面究竟是个啥?

目录 1. 镜像面概念 2. 镜像面示意 3. 镜像面工作原理 4. 总结 PCB设计中涉及到高频信号处理时经常会听到一个叫做镜像面的概念。镜像面究竟是哪个面&#xff1f;和我们平时所说的地平面和电源平面有什么区别&#xff1f; 1. 镜像面概念 镜像面是指高频信号在完整平面上的…

退货单不能反价值重估的操作

财务的工作效率几何级式倍增。29号做的退货单&#xff0c;30号就做了发票。业务员工作质量却是堪忧&#xff0c;退货单做了2次。这样的问题是常态&#xff0c;该如何避免呢&#xff1f; 从提示文字分析&#xff0c;不能弃审&#xff0c; 一般是单据被下游单据锁定导致的&#…

算法 | 模拟

目录 替换所有的问号 题解&#xff1a; 提莫攻击 题解&#xff1a; Z字形变换 题解&#xff1a; 外观数列 题解&#xff1a; 数青蛙 题解&#xff1a; 替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/re…

AFSim仿真系统 --- 系统简解_03( Warlock模块 - 人在环路 在仿真领域中指的是AFSIM的操作员互动可视化应用程序)

我们就用保留单词 Warlock Warlock&#xff08;在仿真领域中指的是AFSIM的操作员互动可视化应用程序--人在环路 &#xff09; Warlock是AFSIM的操作员环环相扣&#xff08;Operator-in-the-Loop&#xff09;视觉应用程序。它提供了一个图形环境&#xff0c;用于在运行时查看和…