三大主要排序方法总结:快速排序,选择排序,冒泡排序

本文介绍:三大排序方法(快速排序,选择排序,冒泡排序)(后续期间可能会发布一篇关于qsort函数的文章)

自我介绍:一个脑子不好的大一学生,c语言接触还没到半年,若涉及到效率等问题,各位都可以在评论区提出见解,谢谢啦。

该账号介绍:此帐号会发布游戏(目前还只会简单小游戏),算法,基础知识等内容。

文章特点:会将重要步骤和易错点在代码中用注释标示(方便各位理解和定位)

1.选择排序

(1)初始版本

在整个数组中选择最小的数,放到最前的位置

动图链接:

https://img-blog.csdnimg.cn/20200629172829794.gif

//选择排序
//在整个数组中选择最小的数,放到最前的位置
void xuan_ze_pai_xu(int* arr,int n)
{
	for(int j=0;j<n-1/**/; j++)
	{	
	 //n-1的原因:当min=n-2时,n-1前面都为小于下标为n-1的元素,无需再进行一次比较,影响效率
		int min=j;
		/*要更新最开始min的下标*/
		for (int i =j+1/**/; i < n; i++)
		{
			if (arr[i] < arr[min])
				min = i;
		 /*更新最小值的下标,方便后续调换其到 当时比较范围的最前面的位置(j所在位置)*/
		}

		//调换最小值到对应位置
		int t = arr[min];
		arr[min] = arr[j];
		arr[j] = t;
	}
	
}

int main()
{
	int n, arr[1000] = { 0 };//n:数组元素个数
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	xuan_ze_pai_xu(arr, n);

	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

(2)优化版本

通过同时找筛查范围的最大值和最小值下标,并将其分别移至该数组的最前方和最后方,以减少其比较次数(以下图片方便理解)

5e32866510f34942b17a581497bbf137.png

//选择排序优化

void xuan_ze_pai_xu(int *arr, int sz)
{
	int l=0, r=sz-1;
	//l:左下标,r:右下标
	while (l < r)
	{
		int max=r, min=l;
		/*必须得放入循环内,因为进行完一次排序后要更新下一次排序后最大最小值的位置*/
		//max:剩下的数中的最大值的下标,min:剩下的数中的最小值的下标

		for (int i = l;i <= r; i++)
		{/*注意是<=*/
			if (arr[i] < arr[min])
				min = i;//更新最值下标
			if (arr[i] > arr[max])
				max = i;//更新最值下标
		}

		//调换最大值和最小值到相应位置
		if (min != l)
		{
			int t = arr[min];
			arr[min] = arr[l];
			arr[l] = t;
		}

		if (max == l)
		//如果最大元素的下标在一开始l所在的位置,
		//因为在上半部分已经改掉下标为l的元素的值为最小值,
		//所以原来l对应的元素值已被调换至min下标的位置
		//因此要进行max=min的操作;
		//(若先是调换最大值到r所指位置,后调换最小值到l所指位置,则该处写为:min=max)
			max = min;
		/*!!!!!!!!!超级关键的关键点!!!!!!!!!!*/

		if (max != r)
		{
			int t = arr[max];
			arr[max] = arr[r];
			arr[r] = t;
		}

		/*以下为错误写法*/
		/*if (min != l)
		{
			int t = arr[min];
			arr[min] = arr[l];
			arr[l] = t;
		}
		if (max != r)
		{
			int t = arr[max];
			arr[max] = arr[r];
			arr[r] = t;
		}*/

		l++;
		r--;
		/*更新左下标和右下标*/
	}
}

//10 
//9 8 7 6 5 4 3 2 1 0
//5 32 29 66 91 82
//测试数据
int main()
{
	int n,arr[1000] = { 0 };//n:数字个数
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	xuan_ze_pai_xu(arr, n);

	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

 2.冒泡排序

通过相邻两数的比较,将大的数逐渐移至数组较后的位置,最后将最大的元素冒泡至最后

理解动图:https://img-blog.csdnimg.cn/2020062712431452.gif

//冒泡排序
通过相邻两数的比较,将大的数逐渐移至数组较后的位置,最后将最大的元素冒泡至最后
/*若有n个元素,则一共会进行n-1次排序,每次会把最大的推到最后,在推到最后的过程中
会进行n-1-i次操作*/
/*是j和j+1比较,相邻两数比较*/
void mao_pao_paixu(int* arr, int sz)
{
	int i = 0;
	for (int i = 0; i < sz-1/**/; i++)
	{
		//外循环,会进行sz-1次比较(10个数只进行9次比较)
		for (int j = 0/*从0开始,而不是i+1*/; j < sz - 1 - i/*!!!!!!!!!*/; j++)
		{
			/*内循环,会进行sz-1-i次比较(与外循环原理相同)*/
			if (arr[j] > arr[j+1/**/])
			{
				int t = arr[j+1];
				arr[j+1] = arr[j];
				arr[j] = t;
			}
		}
	}
}

int main()
{
	int arr[] = { 10,9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);/**/
	mao_pao_paixu(arr, sz);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

3.快速排序 

思路

先取a[0]为基准值,左指针为0,右指针为n-1,i=左指针,j=右指针,如果a[j]>=基准值,j向左移动,如果不是,则a[i++]=a[j];如果a[i]<=基准值,i向右移动,如果不是,则a[j--]=a[i];直到i等于j,本次循环结束(左边已经全为小于基准值的数,右边已经全为大于基准值的数,令a[i]=基准值),递归进入下一次循环,参数为:pai_xu(a,l,i-1);pai_xu(a,i+1,r);

动图链接:https://img-blog.csdnimg.cn/20210515183213169.gif#pic_center#pic_center

(动图中的key即为我的:ji_zhun)

关键:l,r,ji_zhun,递归
void pai_xu(int* a/*或者int a[]*/, int l, int r)
{
	if (l < r)
	{
		int i = l,j=r,ji_zhun=a[l];
		while (i < j)
		{
			while (i < j && a[j] >= ji_zhun)
			{
				j--;
			}
			if (i < j)
				a[i++] = a[j];
			while (i < j && a[i] <= ji_zhun)
			{
				i++;
			}
			if (i < j)
				a[j--] = a[i];
		}
		a[i] = ji_zhun;

		pai_xu(a, l, i - 1);
		pai_xu(a, i+1, r);

	}
}


int main()
{
	int a[10000];
	int n = 10;
	for (int i = 0; i < n; i++)
		scanf("%d", &a[i]);
	int ji_zhun = a[0],l=0,r=n-1;
	pai_xu(a,l,r);
	for (int i = 0; i < n; i++)
		printf("%d ", a[i]);
	printf("\n");
	return 0;
}

今天时2024年1月1日,在此对大家说一句:元旦快乐,祝你在新的一年收获满满,健健康康,平平安安

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring面试篇

Spring面试篇 前置知识ApplicationContextInitializerApplicationListenerBeanFactoryBeanDefinitionBeanFactoryPostProcesssorAwareInitialzingBean&#xff0c;DisposableBeanBeanPostProcessor SpringBoot启动流程IOC容器初始化流程Bean生命周期Bean循环依赖解决 SpringMvc…

Java-IO流-15

文件操作 文件创建 package com.edu.file;import org.junit.jupiter.api.Test;import java.io.File; import java.io.IOException;public class Demo01 {public static void main(String[] args) {}Test//方式1public void create01(){String filePath "D:\\new1.txt&q…

阿里云服务器地域如何选择?

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

JSP+Servlet 重要知识点 (含面试题)

JSP是Servlet技术的扩展&#xff0c;本质上就是Servlet的简易方式。JSP编译后是“类servlet”。 这里提一句&#xff1a; jsp已经没有深入学习的必要了&#xff0c;除了维护老项目能用上一些&#xff0c;基本属于被淘汰的边缘了。Servlet还是有必要学习一下&#xff0c;比如sp…

Java:Stream流

文章目录 1、体验Stream流2、Stream流的常见生成方式3、Stream流中间操作方法4、Stream流终结操作方法5、Stream流的收集操作6、Stream流综合练习6.1 练习16.2 练习26.3 练习3 以下代码使用JDK11编写。 1、体验Stream流 &#xff08;1&#xff09;案例需求 按照下面的要求完成…

如何使用css隐藏掉滚动条

1.解决方案 在滚动元素上再包裹一个父元素&#xff0c;然后&#xff0c;该元素添加如下代码&#xff1a; &#xff08;注&#xff1a;PC端浏览器滚动条为8px&#xff09;使元素偏移原来位置8px&#xff0c;目的就是将滚动条区域移动到父元素边框外面&#xff0c;然后&#xff…

AI教我学编程之AI自刀

AI教我学编程系列学习第二课 — C#变量类型 上节回顾知识梳理C#基本变量类型 对话AI分歧产生本段总结 它说得对吗&#xff1f;我随即发问经典AI自刀他来了 总结 上节回顾 在上一节中我们发现&#xff0c;AI工具似乎还不能达到教学的水平&#xff0c;所以在本节中&#xff0c;…

ORA-600 adg无法查询故障

再续前缘 ORA-600[12406]故障解决-CSDN博客 当你点背的时候&#xff0c;看似一个简单的case&#xff0c;总是会迎来反转 上次改完参数没两天&#xff0c;又出现了报错不同&#xff0c;但是现象相似的情况 这次是 ORA-600 [kksgaGetNoAlloc_Int0] 这次出现故障的范围更大&a…

【Spring Boot 源码学习】SpringApplication 的定制化介绍

Spring Boot 源码学习系列 SpringApplication 的定制化介绍 一、引言二、往期内容三、主要内容1. 基础配置1.1 设置关闭 Banner1.2 设置自定义 Banner 打印对象1.3 设置应用程序主入口类1.4 设置用于创建应用程序上下文的工厂1.5 添加 BootstrapRegistry 初始化器实现1.6 设置或…

Python学习之路——函数进阶

目录 一、函数的多返回值 &#xff08;一&#xff09;如何操作 &#xff08;二&#xff09;代码示例 二、函数的多种传参方式 &#xff08;一&#xff09;位置参数 &#xff08;二&#xff09;关键字参数 &#xff08;三&#xff09;缺省参数 1、定义 2、作用 3、代码示…

Spring之代理模式

1、概念 1.1 介绍 二十三种设计模式中的一种&#xff0c;属于结构型模式。它的作用就是通过提供一个代理类&#xff0c;让我们在调用目标方法的时候&#xff0c;不再是直接对目标方法进行调用&#xff0c;而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中…

互联网分布式应用之SpringCloud

SpringCloud Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. 微服务项目介绍 2. Eure…

C++ goto语句

作用&#xff1a;可以无条件跳转语句&#xff0c;类似计算机组成原理mips指令集中的jump直接跳转指令&#xff08;汇编语言&#xff09;。 语法&#xff1a;goto标记&#xff1b; 解释&#xff1a;如果标记的名称存在&#xff0c;执行到goto语句时&#xff0c;会跳转到标记的…

小游戏实战丨基于PyGame的贪吃蛇小游戏

文章目录 写在前面PyGame贪吃蛇注意事项系列文章写在后面 写在前面 本期内容&#xff1a;基于pygame的贪吃蛇小游戏 下载地址&#xff1a;https://download.csdn.net/download/m0_68111267/88700188 实验环境 python3.11及以上pycharmpygame 安装pygame的命令&#xff1a;…

python实现windows内存看门狗程序(带GUI界面)

python实现windows内存看门狗程序&#xff08;带GUI界面&#xff09; 效果图 1、程序核心 看门狗程序核心&#xff1a; 1、运行特定程序任务进程 2、监控任务管理器上的内存使用率 3、如果超过阈值则关闭该特定程序进程 4、重新开启该特定程序 5、重复过程2持续监控2、程序流…

Spring Boot 基础知识点1 (含面试题1)

Spring Boot 是一款基于 Spring 框架的开源应用程序开发工具&#xff0c;它旨在简化 Spring 应用程序的配置和开发过程。Spring Boot 提供了一种简单的方式来创建可独立运行的、生产级别的应用程序&#xff0c;并在需要时进行部署。Spring Boot 在微服务架构和云计算环境下得到…

thinkphp6实现简单定时任务

thinkphp6实现定时任务 创建定时任务文件定义指令编写Test.php代码运行测试 创建定时任务文件 Test类名根据自己的需要修改 php think make:command Test testcommand文件夹在app目录下没有需要自己创建 运行上面的命令后会在command下 多一个Test.php文件 定义指令 在conf…

PHP代码审计之实战审代码篇2

4. 仔细观察如下代码&#xff0c;思考代码有什么缺陷&#xff0c;可能由此引发什么样的问题&#xff1f; <?php require_once("/home/rconfig/classes/usersession.class.php"); require_once("/home/rconfig/classes/ADLog.class.php"); require_onc…

金和OA C6 SAP_B1Config.aspx 未授权漏洞

产品介绍 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 漏洞描述 金和OA C6 SAP_B1Config.aspx接口 未授权&#xff0c;攻击者可通过此漏洞获取数据库账户密码等敏…

2024最新前端源码分享(附效果图及在线演示)

分享10款非常有趣的前端特效源码 其中包含css动画特效、js原生特效、svg特效以及小游戏等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 粒子文字动画特效 基于canvas实现的粒子文字动画特效 会来回切换设定的文字特效 图…