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

news2024/9/30 9:33:18

本文介绍:三大排序方法(快速排序,选择排序,冒泡排序)(后续期间可能会发布一篇关于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日,在此对大家说一句:元旦快乐,祝你在新的一年收获满满,健健康康,平平安安

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

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

相关文章

【Pytorch】学习记录分享11——GAN对抗生成网络

PyTorch GAN对抗生成网络 0. 工程实现1. GAN对抗生成网络结构2. GAN 构造损失函数&#xff08;LOSS&#xff09;3. GAN对抗生成网络核心逻辑3.1 参数加载&#xff1a;3.2 生成器&#xff1a;3.3 判别器&#xff1a; 0. 工程实现 原理解析&#xff1a; 论文解析&#xff1a;GAN…

LLM Agent之RAG的反思:放弃了压缩还是智能么?

已经唠了三章的RAG&#xff0c;是时候回头反思一下&#xff0c;当前的RAG是解决幻觉的终点么&#xff1f;我给不出直接的答案&#xff0c;不过感觉当前把RAG当作传统搜索框架在大模型时代下的改良&#xff0c;这个思路的天花板高度有限~ 反思来源于对RAG下模型回答的直观感受&…

DrGraph原理示教 - OpenCV 4 功能 - 直方图

OpenCV直方图是一种可以对整幅图的灰度分布进行整体了解的图示。它是带有像素值&#xff08;从0到255&#xff0c;不总是&#xff09;的图在X轴上&#xff0c;在y轴上的图像对应的像素个数。通过观察图像的直方图&#xff0c;我们可以直观的了解图像的对比度、亮度、亮度分布等…

数据分析——快递电商

一、任务目标 1、任务 总体目的——对账 本项目解决同时使用多个快递发货&#xff0c;部分隔离区域出现不同程度涨价等情形下&#xff0c;如何快速准确核对账单的问题。 1、在订单表中新增一列【运费差异核对】来表示订单运费实际有多少差异&#xff0c;结果为数值。 2、将…

HarmonyOS 开发基础(六)Slider

HarmonyOS 开发基础&#xff08;六&#xff09;Slider Entry Component struct Index {build() {Row() {Column() {// Slider&#xff1a;ArkUI 的基础组件 滑动条组件// options 参数&#xff1a;Slider 基础设置Slider({// 最小值min: 20,// 最大值max: 200,// 当前值value: …

文心一言 VS 讯飞星火 VS chatgpt (173)-- 算法导论13.3 2题

二、用go语言&#xff0c;将关键字41、38、31、12、19、8连续地插入一棵初始为空的红黑树之后&#xff0c;试画出该结果树。 文心一言&#xff1a; 首先&#xff0c;我们需要了解红黑树的性质。红黑树是一种自平衡二叉查找树&#xff0c;其中每个节点要么是红色&#xff0c;要…

使用sentinel作为熔断器

什么是sentinel Sentinel&#xff0c;中文翻译为哨兵&#xff0c;是为微服务提供流量控制、熔断降级的功能&#xff0c;它和Hystrix提供的功能一样&#xff0c;可以有效的解决微服务调用产生的“雪崩”效应&#xff0c;为微服务系统提供了稳定性的解决方案。随着Hytrxi进入了维…

7+非肿瘤+WGCNA+机器学习+诊断模型,构思巧妙且操作简单

今天给同学们分享一篇生信文章“Platelets-related signature based diagnostic model in rheumatoid arthritis using WGCNA and machine learning”&#xff0c;这篇文章发表在Front Immunol期刊上&#xff0c;影响因子为7.3。 结果解读&#xff1a; DEGs和血小板相关基因的…

Flink自定义Source模拟数据流

maven依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

CSS3 边框border、outline、box-shadow

1 border 语法&#xff1a;border: width style color 2 outline 语法&#xff1a;outline: width style color 2.1 outline-offet MDN解释&#xff1a;用于设置outline与一个元素边缘或边框之间的间隙 即&#xff1a;设置outline相对border外边缘的偏移&#xff0c;可以为…

Python 全栈体系【四阶】(十一)

第四章 机器学习 机器学习&#xff1a; 传统的机器学习&#xff1a;以算法为核心深度学习&#xff1a;以数据和计算为核心 感知机 perceptron&#xff08;人工神经元&#xff09; 可以做简单的分类任务掀起了第一波 AI 浪潮 感知机不能解决线性不可分问题&#xff0c;浪潮…

RouterOS L2TP安装与配置

申明&#xff1a;本文仅针对国内L2TP/PPTP&#xff0c;适用于国内的游戏加速或学术研究&#xff0c;禁止一切利用该技术的翻墙行为。 1. L2TP介绍 L2TP&#xff08;Layer 2 Tunneling Protocol&#xff09;是一种在计算机网络中广泛使用的隧道协议&#xff0c;它被设计用于通过…

java火车查询管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web火车查询管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

2023年12月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536 输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。 输出 一行两个数,分…

电子学会C/C++编程等级考试2023年12月(二级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:统计指定范围里的数 给定一个数的序列S,以及一个区间[L, R], 求序列中介于该区间的数的个数,即序列中大于等于L且小于等于R的数的个数。 时间限制:1000 内存限制:65536 输入 第一行1个整数n,分别表示序列的长度。(0 < n ≤…

使用Enterprise Architect绘制架构图

如何使用Enterprise Architect绘制架构图 之前没有使用过Enterprise Architect软件绘制&#xff0c;目前由于工作需求&#xff0c;需要使用Enterprise Architect绘制一些架构图&#xff0c;现在只使用Enterprise Architect绘制过简单的Flow Chart&#xff0c;想请教一下大神们…

如何批量自定义视频画面尺寸

在视频制作和编辑过程中&#xff0c;对于视频画面尺寸的调整是一项常见的需求。有时候&#xff0c;为了适应不同的播放平台或满足特定的展示需求&#xff0c;我们需要对视频尺寸进行批量调整。那么&#xff0c;如何实现批量自定义视频画面尺寸呢&#xff1f;本文将为您揭示这一…

纳尼??Rabbitmq居然被一个逗号给坑了??

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 前言 这个问题发生在部署一套新的环境。搭建一个单节点的Rabbitmq&#xff0c;按照小伙伴写的部署文档搭建的。其中搭建步骤和我…

JetCache源码解析——配置加载

JetCache自动化配置加载 JetCache的配置加载主要是在jetcache-autoconfigure模块中完成的&#xff0c;无论是使用内存缓存LinkedHashMap和caffeine&#xff0c;亦或是通过lettuce、redisson和spring-data-redis来操作Redis服务缓存数据&#xff0c;其自动加载配置的操作基本上…

JSON Crack数据可视化工具结合内网穿透实现公网访问

文章目录 1. 在Linux上使用Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址 JSON Crack 是一款免费的开源数据可视化应用程序&#xff0c;能够将 JSON、YAML、XML、CSV 等数据格式可视化为交互…