排序(1)——直接插入排序+冒泡排序

目录

1 排序的概念及其应用

1.1 排序的概念

1.2 排序的应用

1.3 常见的排序算法 

2 直接插入排序

2.1 基本思想

 2.2 基本思路

2.3 代码实现

2.4 时间复杂度

3 冒泡排序(回顾)

3.1 思路分析

3.2 时间复杂度 

4 比较


1 排序的概念及其应用

1.1 排序的概念

  • 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
  • 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
  • 内部排序:数据元素全部放在内存中的排序。
  • 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

1.2 排序的应用

排序可以应用在各种排名中(大学、品牌、成绩等),

1.3 常见的排序算法
 

我们现在已经学了冒泡排序O(N*N)堆排序O(N*logN)

接下来我们先讲直接插入排序。

2 直接插入排序

2.1 基本思想

直接插入排序是一种简单的插入排序法,其基本思想是:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

实际中我们玩扑克牌时,就用了插入排序的思想。

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移。

  • end表示一个下标,它的范围是[0,n-2],也就是最多只能指向倒数第二个数
  • 下标[0,end]是有序区间,end+1的下标插入这段有序区间仍是有序的。

直接插入排序的特性总结:

1. 元素集合越接近有序,直接插入排序算法的时间效率越高

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

3. 空间复杂度:O(1),它是一种稳定的排序算法

4. 稳定性:稳定 

 2.2 基本思路

  • 先单趟再多趟,先局部再整体。

单趟

 如上只是简单的一趟排序,并不确定是哪一趟。而我们要实现的是多趟排序,这样才能把一组数据排好。那么如何进行多趟呢?

我们只需要再加一个循环即可,让end从0++到n-2。

  • end不能是n-1,因为n-1的值是要和前面比较的,n个数的下标范围是[0,n-1]。

2.3 代码实现

//升序
void InsertSort(int* a, int n)
{
	//[0,end]end+1插入
	for (int i = 0; i < n - 1; i++)
	{
		int end=i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

打印代码 

void PrintSort(int* a, int n)
{
	for (int i = 0; i < n; i++) {
		printf("%d ", a[i]);
	}
	printf("\n");
}

  • 提问:如果让i从1开始循环,可以吗?

不可以,如果i=1的话,那么就是从下标为2的那个数开始向前插入,也就是第三个数。但是我们并不确定第一个数和第二个数是否有序,所以不可以!

  • 提问:这个位置可以存储数据个数吗?

不可以,哨兵位的头节点也不可以存储数据个数。因为数据类型不一样。数据类型可能会是char/double等,无法记录个数。 

2.4 时间复杂度

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

最好情况——顺序有序:O(N)

最差情况——逆序:O(N^2)

3 冒泡排序(回顾)

回顾戳👉冒泡排序法代码

3.1 思路分析

单趟

  • 每一趟都是从第一个数开始,然后依次从前往后两两比较,这里我们用升序。只要前面的数大于后面的数,我们就交换两个数的位置。比较完一组以后++i,再依次后面的两个数。
void BubbleSort(int* a, int n)
{
	for (int i = 1; i < n - j; i++)
	{
		if (a[i - 1] > a[i])
		{
			Swap(&a[i - 1], &a[i]);
		}
	}
}

//或者i从0开始,要注意范围的改变
for (int i = 0; i < n-1; i++)
	{
		if (a[i] > a[i+1])
		{
			Swap(&a[i], &a[i+1]);
		}
	}

多趟

  • 这里我们要控制的是结束位置。经过一趟排序后,最大的那个数已经排到最后面了,所以下一趟就不需要再与那个数比较了(改变i)。所以我们可以再写一个循环来控制多趟,j<n表示一共要实行n趟。
void BubbleSort(int* a, int n)
{
	for (int j = 0; j < n; j++)
	{
		//一趟
		for (int i = 1; i < n - j; i++)
		{
			if (a[i - 1] > a[i])
			{
				Swap(&a[i - 1], &a[i]);
			}
		}
    }
}

3.2 时间复杂度 

  • 时间复杂度:O(N^2)
  • 最好情况——已经有序:O(N)。

最好的情况就是不进里面的循环,只进入外面的循环,循环一圈出来发现没有数进行交换。

那我们怎么才能看出来有没有进循环呢?

  • 代码这样改
  • 如果进循环了,exchange就改为true,没有进就仍旧为false。
void BubbleSort(int* a, int n)
{
	for (int j = 0; j < n; j++)
	{
		bool exchange = false;
		for (int i = 1; i < n - j; i++)
		{
			if (a[i - 1] > a[i])
			{
				Swap(&a[i - 1], &a[i]);
				exchange = true;
			}
		}

		if (exchange == false)
			break;
	}
}

4 比较

冒泡排序和插入排序谁更优?

  • 直接插入排序和冒泡排序的时间复杂度是一个等级的但是直接插入排序效率更好。
  • 因为冒泡排序一直都是等差数列,而插入排序只有在逆序的情况下才会使等差数列,如果后面的数比前面的数大,那么就不用交换了,直接看后面的那个数就可以。(排升序)

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

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

相关文章

STM32 (1)

1.基本信息 stm32是由ST公司生产的一种32位微控制器&#xff08;单片机&#xff09;。 1.1 各种型号 stm32是32位单片机的总称&#xff0c;有多种不同的系列。 32即用32个比特位表示一个地址&#xff0c;寻址范围&#xff1a;0x00000000 --0xffffffff (4GB) 1.2 存储密度 …

「优选算法刷题」:在每个树行中找最大值

一、题目 给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2&#xff1a; 输入: root [1,2,3] 输出: [1,3]提示&#xff1a; 二叉树的节点个数的范围是 [0,104]-231 < N…

Flink:Temporal Table Function(时态表函数)和 Temporal Join

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

第十四届蓝桥杯大赛B组 JAVA 蜗牛 (递归剪枝)

题目描述&#xff1a; 这天&#xff0c;一只蜗牛来到了二维坐标系的原点。 在 x 轴上长有 n 根竹竿。它们平行于 y 轴&#xff0c;底部纵坐标为 0&#xff0c;横坐标分别为 x1, x2, …, xn。竹竿的高度均为无限高&#xff0c;宽度可忽略。蜗牛想要从原点走到第 n 个竹竿的底部也…

Ubuntu20.04使用XRDP安装原生远程桌面

Ubuntu20.04使用XRDP安装原生远程桌面 1.安装gnome桌面 # 如果没有更新过源缓存&#xff0c;先更新一下 sudo apt update# 安装gnome桌面 # 可选参数 --no-install-recommends&#xff0c;不安装推荐组件&#xff0c;减少安装时间和空间占用 sudo apt install ubuntu-desktop…

Docker基础教程 - 1 Docker简介

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 1 Docker简介 Docker是一个强大的容器化平台&#xff0c;让你能够更轻松地构建、部署和运行应用程序。 下面我们来学习 Docker。 1.1 Docker是什么 1 现在遇到的问题 每次部署一台服务器&…

Apache JMeter 5.6.3 安装

源码下载 curl -O https://dlcdn.apache.org//jmeter/source/apache-jmeter-5.6.3_src.zipJMeter 下载 curl -O https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.zipjmeter.properties 里 设置中文 windows系统上解压&#xff0c;双击jmeter.bat 启动 执行参…

618快递准点到达,别忘了感谢它!

进入6月以来&#xff0c;全国快递日均业务量飞速上涨。 虽然618大促是电商的主场&#xff0c;但作为不可或缺的物流环节&#xff0c;为了这场年中大考&#xff0c;快递企业在此期间也使尽浑身解数&#xff0c;竞相比拼配送速度。那么&#xff0c;为了更快的时效&#xff0c;快递…

【基于Matlab GUI的语音降噪系统设计】

客户不要了&#xff0c;挂网上吧&#xff0c;有需要自行下载~ 赚点辛苦费 ** 功能实现: ** 1、导入音频文件/录入音频&#xff0c;能实现播放功能。 2、对导入/录入的音频信号进行时域和频域分析&#xff0c;并制图。 3、可在导入/录入的音频信号上加入噪声&#xff0c;并能够播…

零基础手把手教你创建微信小程序(十六)·事件传参·data-*自定义数据

事件传参&#xff1a;在触发事件时,将一些数据作为参数传递给事件处理函数的过程,就是事件传参。 在微信小程序中,我们经常会在组件上添加一些自定义数据,然后在事件处理函数中获取这些自定义数据,从而完成业务逻辑的开发。 在组件上通过data-"的方式定义需要传递的数据,其…

被通知回老家当农场主,没有经验的我用FarmOS系统抢先体验了一把!

网管小贾 / sysadm.cc 公司小Z过年回来就变得有点魔怔&#xff0c;工作积极性不高&#xff0c;天天话里话外总是唠叨着要辞职回老家种地&#xff01; 老板让我去劝劝他&#xff0c;强调务必对齐颗粒度&#xff0c;说劝好了给我记上一功。 我也不知道之前的那些功啥时候能变现…

【动态规划专栏】

动态规划基础知识 概念 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;&#xff1a;用来解决最优化问题的算法思想。 动态规划是分治思想的延伸&#xff0c;通俗一点来说就是大事化小&#xff0c;小事化无的艺术。 一般来说&#xff0c;…

OpenAI钦点的“机器人界OpenAI”来了:成立不到两年估值破26亿美元

OpenAI们正在今年因AI而再次火热无比的机器人领域“复刻”一个OpenAI。 2024年2月23日&#xff0c;OpenAI、微软、贝佐斯风投、英伟达等总计18位投资公司向一家机器人公司注资了6.75亿美元&#xff0c;这家公司就是Figure AI。 Figure AI成立于2022年&#xff0c;两年不到经过…

(已解决)Unicode高位码点emoji表情无法解析

问题描述 我在制作游戏论坛项目&#xff0c;希望制作一个表情库&#xff0c;我参考了菜鸟的emoji手册&#xff0c;并且使fromCharCode函数来进行字符串转换&#xff0c;但是经过我的测试&#xff0c;对于超过5位数的高位码点&#xff0c;无法正常解析。 源码&#xff1a; &l…

WiFi模块引领零售数字化转型:智能零售体验再定义

随着科技的不断发展&#xff0c;零售业正迎来一场数字化转型的浪潮。在这个变革过程中&#xff0c;WiFi模块成为零售业中的关键技术&#xff0c;为商家提供了丰富的数字化工具&#xff0c;打造了更智能、便捷、个性化的零售体验。本文将深入探讨WiFi模块在零售数字化转型中的关…

学习使用paddle来构造hrnet网络模型

1、首先阅读了hrnet的网络结构分析&#xff0c;了解到了网络构造如下&#xff1a; 参考博文姿态估计之2D人体姿态估计 - &#xff08;HRNet&#xff09;Deep High-Resolution Representation Learning for Human Pose Estimation&#xff08;多家综合&#xff09;-CSDN博客 最…

Python的With...As 语句:优雅管理资源的技术探索【第116篇—With...As 语句】

Python的With…As 语句&#xff1a;优雅管理资源的技术探索 在Python编程中&#xff0c;with...as语句是一项强大而优雅的功能&#xff0c;用于管理资源&#xff0c;如文件、网络连接、数据库连接等。本文将深入介绍with...as语句的用法、其工作原理&#xff0c;并通过代码示例…

光子嫩肤仪面罩控制器PCB电路中升压恒流芯片FP7208的应用

护肤已经成为现代人日常生活中不可或缺的一部分&#xff0c;尤其对于追求美丽肌肤的人来说&#xff0c;寻找一款适合自己的护肤利器至关重要。 光子嫩肤仪作为一种高科技美容仪器&#xff0c;受到越来越多人的追捧。其中&#xff0c;FP7208LED升压驱动IC作为其核心部件之一&am…

TQ15EG开发板教程:创建运行petalinux2019.1

工程网盘链接&#xff1a;https://pan.baidu.com/s/1vFRpzmbifXt7GypU9aKjeg 提取码&#xff1a;0ylh 首先需要使用与petalinux相同版本的vivado创建工程&#xff0c;与之前不同的是在创建硬件设计时需要勾选上添加bit文件&#xff0c;所以要在生成bit文件之后再创建硬件设计…

谷粒商城【成神路】-【8】——商品上架

目录 1.数据模型封装 1.es数据模型 2.将es数据模型封装为JAVA bean 3.根据前端发送请求,编写controller 2.模型实现 2.1服务controller 2.2服务service 2.3服务远程调用接口 2.4检索服务controller 2.5检索服务保存到es 2.6库存查询服务 1.数据模型封装 1.es数据模…