【C语言 || 排序】希尔排序

news2024/12/24 2:40:58

文章目录

    • 前言
    • 1.希尔排序
        • 1.1 直接插入排序
        • 1.2 直接插入排序的实现
          • 1.2.1 直接插入排序的代码实现
        • 1.3 直接插入排序的时间复杂度
        • 1.4 希尔排序
          • 1.4.1 希尔排序概念
          • 1.4.1 希尔排序的代码实现

前言

1.希尔排序

1.1 直接插入排序

在写希尔排序之前,我们需要先了解直接插入排序。直接插入排序是一种简单而稳定的排序算法。它的工作原理是将一个待排序序列分为已排序区间未排序区间,初始时已排序区间只有序列的第一个元素。然后从未排序区间中取出第一个元素,插入到已排序区间的合适位置,使其成为新的已排序区间。重复这个过程,直到未排序区间为空。

图示:

在这里插入图片描述

定义一个变量end,在[0,end]之间是有序的,然后从end+1的位置开始往前比较,一个一个进行比较,(当前是排升序)如果end+1小于end,那就直接让end覆盖住end+1,end+1需要提前记录下来。

1.2 直接插入排序的实现

写排序最好是先写单趟排序,写完之后再开始整体, 定义一个变量end,在[0,end]之间是有序的,单趟排序是将end+1从往[0,end]直接进行插入比较,(当前是需要排升序),end+1如果大于end,就直接让end覆盖end+1。

1.2.1 直接插入排序的代码实现
void InsertSort(int* a,int n)
{
	for(int i = 0; i < n - 1 ; i++)
	{
		int end = i;
		int tmp = a[end + 1];
		while(end>=0)
		{
			if(tmp < a[end])
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end+1] = tmp;
	}
}
1.3 直接插入排序的时间复杂度

最差是O(N^2),就是逆序的时候,所有数都需要进行插入排序。

最好就是O(N) 了,就是有序的情况了,当在有序的时候,只需要遍历一遍就可以了,不需要进行插入排序。

我们可以思考一下,如何优化。
可以想到如果我们让这个数组前面的那些比较大的数,让它们先到最后是不是就接近有序了。这就是希尔(Donald Shell)从直接插入排序优化的版本,起名为希尔排序。

1.4 希尔排序
1.4.1 希尔排序概念

希尔排序(ShellSort)是一种基于插入排序的算法,它通过比较相距一定间隔的元素来工作,各趟比较所用的间隔随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。
希尔排序的基本思想是:先将整个待排序的记录序列分割成为gap份序列分别进行直接插入排序,然后依次缩减gap再进行排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。

1.预排序.
2.直接插入排序.

当gap==3时,如图所示:
在这里插入图片描述

这样较大的数就交换到了数组的后面,在进行一次直接插入排序就可以排好顺序了。

希尔排序的时间复杂度大概是O(1.25*N^1.26)
空间复杂度是O(1)

1.4.1 希尔排序的代码实现
void ShellSort(int* a,int n)
{
	int gap = n;
	while(gap > 1)
	{
		gap = gap/3 + 1;
		for(int i = 0;i<n-gap;i++)
		{
			int end = i;
			int tmp = a[end + gap];
			while(end >= 0)
			{
				if(tmp < a[end])
				{
					a[end + gap] = a[end];
					end-=gap;
				}
				else
				{
					break;
				}
			}	
			a[end + gap] = tmp;
		}
	}
}

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

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

相关文章

电压模式R-2R DAC的工作原理和特性

本文将探讨电压模式R-2R DAC结构。 在本文中&#xff0c;我们将探索什么是R-2R DAC以及如何实现它们。 首先&#xff0c;我们将简要回顾一下开尔文分压器DAC。这种结构很简单&#xff0c;但它们需要大量的电阻和开关来实现高分辨率DAC。这个问题的一个解决方案是称为R-2R DAC…

【python】用代码实现2024中科大强基计划数学科目第一题

题目&#xff1a; 已知正整数a,b,c满足10a11b12c123,&#xff0c;则&#xff08;a,b,c&#xff09;的组数是 思路&#xff1a; 为了找出满足等式 10a 11b 12c 123 的正整数三元组 (a, b, c) 的数量&#xff0c;我们可以使用Python编写一个简单的循环来遍历可能的 a、b 和…

哪种考勤机好用,常见好用的考勤机种类

哪种考勤机好用&#xff0c;常见好用的考勤机种类 用考勤机完成上下班打卡制度&#xff0c;极大地为人事对公司的管理提供了便利。不同种类的考勤机均有各自的长处&#xff0c;那么究竟哪种考勤机比较好用呢&#xff1f;其中&#xff0c;智能云考勤机能够实现异地手机打卡&…

推荐一个Python的前端框架Streamlit

WHY&#xff0c;为什么要用Streamlit 你是不是也想写一个简单的前端界面做些简单的展示和控制&#xff0c;不想写html、css、js&#xff0c;也用不到前后端分离&#xff0c;用不到特别复杂的Flask、Django等&#xff0c;如果你遇到类似这样的问题&#xff0c;我推荐你试试Stre…

Linux下调试代码——gdb的使用

1. 文件准备&#xff1a; 测试代码&#xff1a; Makefile文件&#xff1a; 执行结果&#xff1a; 此时&#xff0c;我们的结果是存在问题的&#xff0c;即最终结果少了100。现在我们用gdb来调试它。 我们发现我们还没有安装gdb&#xff0c;这里安装一下。 2. 环境准备&#…

CUDA系列-Mem-9

这里写目录标题 Static Architecture.Abstractions provided by CUSW_UNIT_MEM_MANAGERMemory Object (CUmemobj) Memory Descriptor(CUmemdesc)Memory Block(CUmemblock)Memory BinsSuballocations in Memory BlockFunctional description Memory Manager 你可能觉得奇怪&…

MacOS之解决:开盖启动问题(七十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

LSTM架构的演进:LSTM、xLSTM、LSTM+Transformer

文章目录 1. LSTM2. xLSTM2.1 理论介绍2.2 代码实现 3. LSTMTransformer 1. LSTM 传统的 LSTM (长短期记忆网络) 的计算公式涉及几个关键部分&#xff1a;输入门、遗忘门、输出门和单元状态。 2. xLSTM xLSTM之所以称之为xLSTM就是因为它将LSTM扩展为多个LSTM的变体&#xff…

Spring的自动注入(也称为自动装配)

自动注入&#xff08;也称为自动装配&#xff09;是Spring框架中的一个核心概念&#xff0c;它与手动装配相对立&#xff0c;提供了一种更简洁、更灵活的方式来管理Bean之间的依赖关系。 在Spring应用程序中&#xff0c;如果类A依赖于类B&#xff0c;通常需要在类A中定义一个类…

终极版本的Typora上传到博客园和csdn

激活插件 下载网址是这个&#xff1a; https://codeload.github.com/obgnail/typora_plugin/zip/refs/tags/1.9.4 解压之后这样的&#xff1a; 解压之后将plugin&#xff0c;复制到自己的安装目录下的resources 点击安装即可&#xff1a; 更改配置文件 "dependencies&q…

SSMP整合案例

黑马程序员Spring Boot2 文章目录 1、创建项目1.1 新建项目1.2 整合 MyBatis Plus 2、创建表以及对应的实体类2.1 创建表2.2 创建实体类2.2.1 引入lombok&#xff0c;简化实体类开发2.2.2 开发实体类 3、数据层开发3.1 手动导入两个坐标3.2 配置数据源与MyBatisPlus对应的配置3…

第1讲:创建vite工程,使用框架为Vanilla时,语言是typescript,修改http端口的方法

直接在项目根目录创建 vite.config.ts文件。 在该文件中添加内容&#xff1a; import { defineConfig } from vite;export default defineConfig({server: {port: 7777,}, });最后尝试运行package.json中的Debug

【图解IO与Netty系列】Netty编解码器、TCP粘包拆包问题处理、Netty心跳检测机制

Netty编解码器、TCP粘包拆包问题处理、Netty心跳检测机制 Netty编解码器编码器解码器编解码器Netty提供的现成编解码器 TCP粘包拆包问题处理Netty心跳检测机制 Netty编解码器 网络传输是以字节流的形式传输的&#xff0c;而我们的应用程序一般不会直接对字节流进行处理&#x…

金蝶BI方案与奥威BI:智能、高效的数据分析组合

在当今数据驱动的时代&#xff0c;企业对于快速、准确、全面的数据分析需求日益增长。金蝶BI方案和奥威BI SaaS平台正是为满足这一需求而精心打造的智能数据分析工具。 方案见效快 金蝶BI方案以其高效的数据处理能力&#xff0c;能够快速地将海量数据转化为有价值的信息。通过…

跟《经济学人》学英文:2024年6月15日这期 America

America seems immune to the world economy’s problems 美国似乎对世界经济问题免疫 immune to&#xff1a;美 [ɪˈmjun tu] 对…有免疫力&#xff1b;不受…感染&#xff1b;不受…的影响&#xff1b;免疫耐受&#xff1b; Elsewhere, political dysfunction and fiscal…

api-ms-win-crt-runtime-l1-1-0.dll文件丢失的情况要怎么处理?比较靠谱的多种修复方法分享

遇到api-ms-win-crt-runtime-l1-1-0.dll文件丢失的情况实际上是一个常见问题&#xff0c;解决此类问题存在多种方法。首先我们先来了解一下api-ms-win-crt-runtime-l1-1-0.dll文件吧&#xff0c;只有了解了我们才知道怎么去解决这个api-ms-win-crt-runtime-l1-1-0.dll文件丢失的…

【机器学习】计算机图形和深度学习模型NeRF详解(2)

1. 引言 本文是"计算机图形和深度学习模型NeRF详解"系列文章的续篇&#xff0c;进一步深入探讨了NeRF的核心技术。NeRF作为一项突破性技术&#xff0c;因其能够从有限的2D图像中重建出完整的3D场景&#xff0c;而在多个领域&#xff0c;如医学成像、3D场景重建、动画…

Spring中网络请求客户端WebClient的使用详解

Spring中网络请求客户端WebClient的使用详解_java_脚本之家 Spring5的WebClient使用详解-腾讯云开发者社区-腾讯云 在 Spring 5 之前&#xff0c;如果我们想要调用其他系统提供的 HTTP 服务&#xff0c;通常可以使用 Spring 提供的 RestTemplate 来访问&#xff0c;不过由于 …

国际荐酒师携手各国际荐酒师专业委员会深化2024年度合作

国际荐酒师&#xff08;香港&#xff09;协会携手广东海上丝绸之路文化促进会及广东省城镇化发展研究会&#xff0c;深化2024年度合作&#xff0c;共同打造品荐与传播大师班培养荐酒师专业人材 近日&#xff0c;国际荐酒师&#xff08;香港&#xff09;协会、广东海上丝绸之路…

通过防抖动代码解决ResizeObserver loop completed with undelivered notifications.

通过防抖动代码解决ResizeObserver loop completed with undelivered notifications. 一、报错内容二、解决方案解释&#xff1a; 一、报错内容 我通过el-tabs下的el-tab-pane切换到el-table出现的报错&#xff0c;大致是渲染宽度出现了问题 二、解决方案 扩展原生的 Resiz…