【算法】直接插入排序、折半插入排序、希尔排序

news2025/2/23 6:31:21

1 直接插入排序

时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:稳定

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

1.1直接插入排序思想

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

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

在这里插入图片描述

1.2直接插入排序代码实现

在这里插入图片描述

void InsertSort(int* a, int n)//直接插入排序:	时间复杂度:O(n*n)	空间复杂度:O(1)
{
	assert(a);

	for (int i = 1; i < n; i++)//总共插入n-1次
	{
		int temp = a[i];//将最后一个数保存下来
		int point = i-1;//从倒数第二个数依次往前遍历

		while (point >= 0)//单趟把末尾的数插入到正确的位置
		{
			if (temp < a[point])//把大的数后移(为了保有稳定性,相等的数不后移)
			{
				a[point + 1] = a[point];
				point--;
			}
			else//因为前面已经排好序了,小于当前的就肯定小于前面的,直接break
			{
				break;
			}
		}
		a[point + 1] = temp;//把数插入到对应的位置
	}
}

2 折半插入排序

时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:稳定

此算法改变了比较元素的次数,比较的时间复杂度约为O(nlogn),但并未改变元素移动的次数,所以总体来看折半插入排序的时间复杂度仍然是O(n*n)

2.1折半插入排序思想

折半插入排序是直接插入排序的优化,在进行第n个数的插入时,对前面0~n-1个数进行二分查找,找到比第n个数小的数的下标,随后进行后移操作。

2.2折半插入排序代码实现

void InsertSort_Binary(int* a, int n)//折半插入排序:	时间复杂度:O(n*n)	空间复杂度:O(1)
{
	assert(a);

	for (int i = 1; i < n; i++)//总共插入n-1次
	{
		int temp = a[i];//将最后一个数保存下来
		int left = 0;
		int right = i - 1;
		int mid;

		while (left<=right)//单次找到小于temp的值的位置
		{
			mid = (left + right) / 2;
			if (temp >= a[mid])
			{
				left = mid + 1;
			}
			else
			{
				right = mid - 1;
			}
		}

		for (int j = i - 1; j >= left; j--)//把此位置及其之后全部后移1位
		{
			a[j + 1] = a[j];
		}
		a[left] = temp;

	}
}

3 希尔排序

时间复杂度:O(n^1.3)——O(n*n)
空间复杂度:O(1)
稳定性:不稳定

《数据结构(C语言版)》— 严蔚敏
在这里插入图片描述

《数据结构-用面相对象方法与C++描述》— 殷人昆在这里插入图片描述

3.1希尔排序思想

由前面我们知道,元素集合越接近有序,直接插入排序算法的时间效率越高。所以我们先对数组进行预排序。

先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。
在这里插入图片描述

3.2希尔排序代码实现

void ShellSort(int* a, int n)//希尔排序:	时间复杂度:O(n^1.3)-O(n^2)	
{
	int gap = n; 

	while (gap > 1)//gap>1时相当于预排序
	{
		gap = gap / 3 + 1;//+1保证了最后一次gap一定是1 

		for (int i = gap; i < n ; i++)//每一轮走(n-gap)次 
		{
			int temp = a[i];//将最后一个数保存下来(每组的最后一个)
			int point = i - gap;//从倒数第二个数依次往前遍历(每组的倒数第二个)
			while (point >= 0)//单趟把末尾的数插入到正确的位置
			{
				if (temp < a[point])
				{
					a[point+gap] = a[point];
					point -= gap;
				}
				else
				{
					break;
				}
			}
			a[point+gap] = temp;
		}
	}
}

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

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

相关文章

使用API有效率地管理Dynadot域名,为域名部署DNS安全拓展(DNSSEC)

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

【排版教程】如何在Word/WPS中优雅的插入参考文献

材料展示 随便选取一段综述内容&#xff0c;以及对应的参考文献&#xff0c;如下图所示&#xff1a; 1 参考文献编辑 首先对参考文献部分进行编辑&#xff0c;将其设置自动编号 在段落中&#xff0c;选择悬挂缩进 在编号中&#xff0c;设置自定义编号&#xff0c;然后按照…

神经形态视觉的实时动态避障系统:突破传统SLAM的响应延迟瓶颈

引言&#xff1a;机器人感知的实时性挑战 斯坦福机器人实验室采用异步脉冲神经网络处理DVS事件相机数据后&#xff0c;动态障碍物响应延迟从34ms降至0.9ms。在20m复杂场景避障测试中&#xff0c;基于神经形态芯片的路径规划系统将SLAM更新频率提升至10kHz&#xff0c;较传统GP…

Linux操作系统4-进程间通信5(共享内存实现两个进程通信)

上篇文章&#xff1a;Linux操作系统4-进程间通信4&#xff08;共享内存原理&#xff0c;创建&#xff0c;查看&#xff0c;命令&#xff09;-CSDN博客 本篇Gitee仓库&#xff1a;myLerningCode/l24 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 本篇重…

RFID测温技术:电力设备安全监测的新利器

在当今高度依赖电力的现代化社会中&#xff0c;稳定且可靠的电力供应是社会运转的基石。电力设备作为电力系统的关键核心&#xff0c;其运行状态直接关乎电力供应的品质。然而&#xff0c;电力设备长期运行过程中&#xff0c;受到诸如过载、接触不良以及环境因素等多重影响&…

(一)趣学设计模式 之 单例模式!

目录 一、啥是单例模式&#xff1f;二、为什么要用单例模式&#xff1f;三、单例模式怎么实现&#xff1f;1. 饿汉式&#xff1a;先下手为强&#xff01; &#x1f608;2. 懒汉式&#xff1a;用的时候再创建&#xff01; &#x1f634;3. 枚举&#xff1a;最简单最安全的单例&a…

自动化办公|xlwings生成图表

在日常的数据分析和报告生成中&#xff0c;Excel图表是一个非常重要的工具。它能够帮助我们直观地展示数据&#xff0c;发现数据中的规律和趋势。然而&#xff0c;手动创建和调整图表往往耗时且容易出错。幸运的是&#xff0c;借助Python的xlwings库&#xff0c;我们可以自动化…

Docker基于Ollama本地部署大语言模型

一、Ollama介绍 Ollama 是一个开源的大型语言模型&#xff08;LLM&#xff09;平台&#xff0c;旨在简化大型语言模型在本地环境中的运行、管理和交互。通过Ollama&#xff0c;用户可以轻松加载和使用各种预训练的语言模型&#xff0c;执行诸如文本生成、翻译、代码编写、问答…

centos9安装k8s集群

以下是基于CentOS Stream 9的Kubernetes 1.28.2完整安装流程&#xff08;containerd版&#xff09;&#xff1a; 一、系统初始化&#xff08;所有节点执行&#xff09; # 关闭防火墙 systemctl disable --now firewalld# 关闭SELinux sed -i "s/SELINUXenforcing/SELINU…

pytest下allure

import pytestdef test_case01():用例01~print(用例01)class Test_mokuai01:def test_case02(self):用例02~print(用例02)if __name____main__:#pytest.main([-vs,test_sample-2.py])pytest.main([-vs,test_sample-2.py,--allure-dir,./result2])#生成allure报告&#xff0c;参…

JVM预热

阿里电商平台每年的各种大促活动&#xff0c;对于Java技术来说&#xff0c;其中重要一个操作环节就是预热操作。 目录 预热是什么&#xff1f;为什么要预热&#xff1f; java 程序不预热和预热的调用对比 预热是什么&#xff1f; 预热是指&#xff0c;在 JVM 启动后&#xff0…

【JavaWeb12】数据交换与异步请求:JSON与Ajax的绝妙搭配是否塑造了Web的交互革命?

文章目录 &#x1f30d;一. 数据交换--JSON❄️1. JSON介绍❄️2. JSON 快速入门❄️3. JSON 对象和字符串对象转换❄️4. JSON 在 java 中使用❄️5. 代码演示 &#x1f30d;二. 异步请求--Ajax❄️1. 基本介绍❄️2. JavaScript 原生 Ajax 请求❄️3. JQuery 的 Ajax 请求 &a…

网页制作06-html,css,javascript初认识のhtml如何建立超链接

超链接有外部链接、电子邮件链接、锚点链接、空链接、脚本链接 一、内部链接 与自身网站页面有关的链接被称为内部链接 1、创建内部链接 1&#xff09;语法&#xff1a; <a href"链接地址"> …… </a> 2&#xff09;举例应用&#xff1a; 3&#xf…

代码讲解系列-CV(七)——前沿论文复现

文章目录 一、论文速览1.1 确定baseline1.2 DepthMaster: Taming Diffusion Models for Monocular Depth Estimation 二、数据环境搭建2.1 环境搭建2.2 数据权重 三、推理debug3.1 单图推理3.2 数据集验证 四、模型训练4.1 数据读取4.2 训练流程 五、作业 一、论文速览 1.1 确…

数据库面试知识点总结

目录 1. MySQL 基础题1.1 执行⼀条 select / update 语句&#xff0c;在 MySQL 中发生了什么&#xff1f;1.2 MySQL 一行记录是怎么存储的&#xff1f; 2. 三大范式3. 数据库引擎3.1 Innodb3.2 MyISAM 4. 数据库索引4.1 索引分类4.2 索引优缺点4.3 索引使用场景4.4 优化索引方法…

1.25作业

1easytornado SSTI——tornado模板 hints.txt&#xff1a;在/fllllllllllllag里&#xff1b;计算filehash的方法&#xff08;需要cookie_secret,对filename进行md5拼接再第二次md5&#xff09; ?filename/hints.txt&filehash{ {2*3}}&#xff0c;跳转到另一个页面 存在且…

Power Query M函数

文章目录 三、PQ高阶技能&#xff1a;M函数3.1 M函数基本概念3.1.1 表达式和值3.1.2 计算3.1.3 运算符3.1.4 函数3.1.5 元数据3.1.6 Let 表达式3.1.6 If 表达式3.1.7 Error 3.2 自定义M函数3.2.1 语法3.2.2 调用定义好的自定义函数3.2.3 直接调用自定义函数3.2.4 自定义函数&am…

python argparse 解析命令行参数

可选参数 带 - 或者 -- 的参数都是可选参数&#xff0c;如果命令行不输入&#xff0c;得到的结果是 None 参数名只能使用下划线&#xff0c;不能使用中划线 default&#xff1a; 设置默认值 action&#xff1a; 默认是 store 方法&#xff0c;常用的是 store_true 命令行出…

【网络编程】服务器模型(二):并发服务器模型(多线程)和 I/O 复用服务器(select / epoll)

一、多线程并发服务器 在 高并发的 TCP 服务器 中&#xff0c;单线程或 fork() 多进程 方式会导致 资源浪费和性能瓶颈。因此&#xff0c;我们可以使用 多线程 来高效处理多个客户端的连接。 承接上文中的多进程并发服务器&#xff0c;代码优化目标&#xff1a; 1.使用 pthr…

自学Java-AI结合GUI开发一个石头迷阵的游戏

自学Java-AI结合GUI开发一个石头迷阵的游戏 准备环节1、创建石头迷阵的界面2、打乱顺序3、控制上下左右移动4、判断是否通关5、统计移动步骤&#xff0c;重启游戏6、拓展问题 准备环节 技术&#xff1a; 1、GUI界面编程 2、二维数组 3、程序流程控制 4、面向对象编程 ∙ \bulle…