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

news2024/12/21 16:30:32

目录

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 比较

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

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

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

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

相关文章

STP保护机制

1、BPDU保护: 为了保护边缘端口,因为当一个边缘端口收到一个BPDU时,会状变为非边缘端口,会参与生成树的计算,如果频繁的UP/DOWN,就使网络一直处于生成树的计算。 解决方法:在交换机的端口开启BPDU保护,当设置为BPDU保护的端口收到BPDU时,系统会将该端口变为down状态。…

网络安全: Kali Linux 使用 nmap 扫描目标主机

目录 一、实验 1.环境 2. Kali Linux (2024.1) 使用 namp 扫描目标主机 3.Kali Linux (2024.1)远程登录 Windows Server 4.Kali Linux (2024.1) 使用crunch字典工具 5.Kali Linux (2024.1)使用hydra密码工具 6.Kali Linux (2022.3) 通过SSH端口获取 Ubuntu 密码 二、问题…

蓝桥杯嵌入式2015年第六届省赛主观题解析

1 题目 2 解析 /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body********************************************************************…

STM32(11)按键产生中断

1.初始化IO引脚&#xff0c;设置模式&#xff0c;速度等 2.设置AFIO&#xff08;配置EXTI的引脚映射&#xff09;&#xff0c;记得开启时钟 3.配置EXTI的通道&#xff08;EXTI0和EXTI1&#xff09; 4.配置NVIC 4.1 中断优先级分组 4.2 配置中断 5.编写中断响应函数 在中断向量…

Vue前端的工作需求

加油&#xff0c;新时代打工人&#xff01; 需求&#xff1a; 实现带树形结构的表格&#xff0c;父数据显示新增下级&#xff0c;和父子都显示编辑。 技术&#xff1a; Vue3 Element Plus <template><div><el-table:data"tableData"style"width…

《数字图像处理(MATLAB版)》相关算法代码及其分析(2)

目录 1 将8连通边界转换为4连通边界 1.1 移除对角线转折 1.2 插入额外像素 1.3 总结 2 将边界信息转换为二进制图像 2.1 函数定义 2.2 参数处理和验证 2.3 默认大小参数设置 2.4 根据参数调整边界位置 2.5 生成二进制图像 2.6 错误处理 2.7 总结 3 对二值图像边界…

【EAI 028】Video as the New Language for Real-World Decision Making

Paper Card 论文标题&#xff1a;Video as the New Language for Real-World Decision Making 论文作者&#xff1a;Sherry Yang, Jacob Walker, Jack Parker-Holder, Yilun Du, Jake Bruce, Andre Barreto, Pieter Abbeel, Dale Schuurmans 作者单位&#xff1a;Google DeepMi…

Sqli-labs靶场第16关详解[Sqli-labs-less-16]自动化注入-SQLmap工具注入

Sqli-labs-Less-16 #自动化注入-SQLmap工具注入 SQLmap用户手册&#xff1a;文档介绍 - sqlmap 用户手册 以非交互式模式运行 --batch 当你需要以批处理模式运行 sqlmap&#xff0c;避免任何用户干预 sqlmap 的运行&#xff0c;可以强制使用 --batch 这个开关。这样&#xff0…

如何使用恢复软件恢复删除的文件?回收站文件恢复攻略

随着计算机在日常生活中的普及&#xff0c;文件的管理和存储成为我们不可或缺的技能。在Windows操作系统中&#xff0c;回收站作为一个帮助我们管理文件删除的重要工具&#xff0c;在误删了一些重要文件之后&#xff0c;我们可能会因为找不到回收站中恢复的文件而感到困惑。本文…

动态规划DP之背包问题3---多重背包问题

目录 DP分析&#xff1a; 优化&#xff1a; 二进制优化 例题&#xff1a; 01背包是每个物品只有一个&#xff0c;完全背包问题是每个物品有无限个。 那么多重背包问题就是 每个物品有有限个。 有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件&#xff0c;每件体…

安卓手机安装termux、kali linux及基本配置

相关阅读&#xff1a;Termux 高级终端安装使用配置教程 | 国光 百度安全验证 该文安装的 kali liunx 应该是简易版的&#xff0c;没有相关工具 一、下载安装termux 建议通过 f-droid 应用市场下载链接termux&#xff0c;点击即直接下载。 二、配置termux 1.更换镜像源 te…

【大厂AI课学习笔记NO.61】环境部署的选择

主要是选择单机和分布式、生产和开发环境的规划等。 开发环境、测试环境、预发布环境和生产环境是软件开发和部署过程中常见的几个环境&#xff0c;它们各自的定义、区别、联系以及实现的关键技术如下&#xff1a; 1. 开发环境&#xff08;Development Environment&#xff09…

深入理解Docker自定义网络:构建高效的容器网络环境

文章目录 一、docker自定义网络介绍1.1 docker自定义网络介绍1.2 使用技术的优势1.3 基本使用流程 二、实战操作2.1 模式理论介绍bridge模式(默认模式)host模式 2.2 模式特点查看桥接模式的特点查看仅主机模式的特点 2.3 实战操作bridge模式host模式自定义网络 一、docker自定义…

STM32单片机基本原理与应用(十)

汉字显示实验 显示原理 字库文件的实际上包含了每个汉字的模。单片机应用经常会用到液晶显示或者LED点阵屏&#xff0c;是用点阵的方式显示的&#xff0c;要显示汉字或字符的时候会用到字模&#xff0c;字模就是字在点阵上显示时对应的编码。以字模的方式存储图形或者文字&am…

【本科组冠名奖】2023年第八届数维杯数学建模挑战赛获奖感言

美国大学生数学建模竞赛已结束过半&#xff0c;现在又迎来了2024年第九届数维杯国赛&#xff0c;准备参加今年数维杯国赛的同学&#xff0c;今天我们一起看看去年优秀的选手都有什么获奖感言吧~希望能帮到更多热爱数学建模的同学。据说文末在看点赞的大佬都会直冲国奖呢&#x…

【.NET Core】.NET中的流(Stream)

【.NET Core】.NET中的流&#xff08;Stream&#xff09; 文章目录 【.NET Core】.NET中的流&#xff08;Stream&#xff09;一、流&#xff08;Stream&#xff09;1.1 FileStream类1.2 IsolatedStorageFileStream类1.3 MemoryStream类1.4 BufferedStream类1.5 NetworkStream类…

BUUCTF---[极客大挑战 2019]Http1

1.题目描述&#xff0c;在地址框输入下面的网址 2.来到页面&#xff0c;ctrlu查看源码&#xff0c;仔细观察会看到一个.php的跳转页面 3.点进去页面提示It doesnt come from https://Sycsecret.buuoj.cn 4.页面提示它不是来源于这个网址&#xff0c;我们需要用bp抓包对数据进行…

matlab 写入格式化文本文件

目录 一、save函数 二、fprintf函数 matlab 写入文本文件可以使用save和fprintf函数 save输出结果: fprintf输出结果: 1.23, 2.34, 3.45 4.56, 5.67, 6.78 7.89, 8.90, 9.01 可以看出fprintf输出结果更加人性化,符合要求,下面分别介绍。 一、save函数 …

深入了解 JavaScript 混淆加密和环境检测

JavaScript混淆加密是一种通过修改代码结构和命名约定来增加代码的复杂性&#xff0c;使其难以被理解和逆向工程的技术。在这篇文章中&#xff0c;我们将深入探讨JS混淆加密的一些逻辑&#xff0c;并介绍如何通过环境检测来提高代码的安全性。我们将使用案例代码演示这些概念。…

外汇110:社交媒体上的金融欺诈激增,网民该如何识别骗局?

社交媒体平台上的金融欺诈正在以令人担忧的速度增加。从某种程度上来说&#xff0c;社交媒体已成为诈骗者的门户&#xff0c;因为它使欺诈者能够方便地与用户联系&#xff0c;并创建一个隐藏在虚假社交媒体资料后面、充斥着非法投资内容的在线角色。 由于社交媒体在我们日常生活…