【数据结构】初步了解排序

news2024/11/25 12:15:52

5a2585dded9b416fb4ea58637b42ed39.png

  Yan-英杰的主页

悟已往之不谏 知来者之可追  

C++程序员,2024届电子信息研究生


目录

1.排序的概念及其运用

        1.1排序的概念

        

 2.常见排序算法的实现

        2.1插入排序

        2.2希尔排序

               问题:gap是多少合适?


1.排序的概念及其运用

        1.1排序的概念

        

        排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排

列起来的操作。

        

        稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这

些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍

在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。

        

        内部排序:数据元素全部放在内存中的排序。

        

        外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动

数据的排序。

        

 2.常见排序算法的实现

        

        2.1插入排序

                        思路:

                        

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

                其实和摸牌的过程是一样的,两个变量之间进行比较,调换位置,根据循环,不断的进

行比较,升序情况下:如果前面一个变量的大于后一个变量,则直接进行交换位置,再和前面的位

置进行比较,知道位置到-1,则不再进行比较

                

                        代码实现:

                        

                                

void InsertSort(int* a, int n)
{
	for (int i = 1; i < n; i++)
	{
		int end = i - 1;
		int tmp = a[i];

		while (end >= 0)
		{
			if (a[end] > tmp)
			{

				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		
		}
		a[end + 1] = tmp;
	}
}

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

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

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

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

4. 稳定性:稳定

        2.2希尔排序

                概念:

                        

        希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文

件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。

然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序

                

                思路:

                以gap距离大小为一组进行比较,我们对其进行排序,之后不断缩小,gap的距离

再次进行排序,随着gap的减小,最后gap缩短为1,排序即可完成

                

                

               问题:gap是多少合适?

                gap越大,跳的越快,越不接近有序,但是排序的速度更快,gap越小跳的越慢,

但是越接近有序,实际当中其界定应该是变化的

        

        

void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap /= 2;
		for (int i = 0; i < n-gap; i++)
		{
			int end = i;
			int tmp = a[i+gap];

			while (end >= 0)
			{
				if ( tmp < a[end] )
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
		PrintArry(a,n);
	}
	

}

希尔排序的特性总结:

1. 希尔排序是对直接插入排序的优化。

2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。

3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的

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

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

相关文章

App上架流程

准备 开发者账号完工的项目 上架步骤 一、创建App ID二、创建证书请求文件 &#xff08;CSR文件&#xff09;三、创建发布证书 &#xff08;CER&#xff09;四、创建Provisioning Profiles配置文件 &#xff08;PP文件&#xff09;五、在App Store创建应用六、打包上架 一、…

设置linux的时间

目录 一、什么是时间 &#xff08;1&#xff09;例子1 &#xff08;2&#xff09;例子2 二、什么是本地时间 三、linux设置本地时间的方法 &#xff08;1&#xff09;方式一&#xff1a;通过互联网自动同步 1.修改时间同步服务器 2.查看时间同步情况 &#xff08;2&…

自动化测试1

目录 1.什么是自动化测试 1.1自动化分类 1.1单元测试 1.2接口测试 1.3UI自动化测试 2.selenium 1.什么是selenium 2.selenium的特点 3.工作原理 3.seleniumJava 1.搭建 1.查看Chrome版本 2.下载Chrome浏览器驱动 3.配置,放到该目录下 2.验证是否搭建成功 1.什么是…

springboot 集成jwt的使用

1.JWT介绍 JWT&#xff08;JSON Web Token&#xff09;是一种基于JSON格式的身份验证和授权标准&#xff0c;经常用于Web应用程序中的用户身份验证。JWT由三个部分组成&#xff1a;头部、载荷和签名。头部包含算法和类型信息&#xff0c;载荷包含用户数据和元数据&#xff0c;…

tolua源码分析(六) C#委托使用lua函数的机制实现

tolua源码分析&#xff08;六&#xff09; C#委托使用lua函数的机制实现 上一节我们讨论lua层如何使用C#的enum以及使用enum需要注意的事项。这一节我们将讨论项目日常开发中经常会用到的委托注册机制&#xff0c;即C#层暴露若干委托和事件&#xff0c;然后在lua层进行注册&…

【沐风老师】3DMAX宇宙生成器(一键生成星系)插件使用方法详解

3DMAX宇宙生成器&#xff08;一键生成星系&#xff09;插件 3DMAX宇宙生成器&#xff08;一键生成星系&#xff09;插件&#xff0c;用于模拟星团及星系的运动。可以创建单个集合进行动画计算&#xff0c;也可以输入不同坐标&#xff0c;建立多个集合后统一进行动画计算。 【安…

探索iOS之CoreImage框架

CoreImage提供图像处理、人脸识别、图像增强、图像滤镜、图像转场。它操作的数据来自Core Graphics、Core Video、Image IO&#xff0c;使用CPU或GPU进行渲染。CoreImage对底层实现进行封装&#xff0c;为上层提供简单易用的API。 一、CoreImage框架 CoreImage框架分为&#…

计算机电脑中了勒索病毒,如何提高windows系统预防faust勒索病毒的能力

当今社会互联网技术迅猛发展&#xff0c;但随之而来的网络安全问题开始引起人们的重视&#xff0c;其中,勒索软件是当前网络安全领域中最具破坏性和危害性的恶意软件之一&#xff0c;而Faust勒索软件就是其中一种。 Faust勒索病毒是一种很可怕的恶意软件&#xff0c;能够破坏并…

计算机网络 - 网络层的数据平面

Overview 首先Network Layer负责的是host to host的传输, 然后可以分为两个平面, 控制平面以及数据平面. 数据平面: 负责forward datagrams from input to output links 决定路由器从input到output 转发功能: 基于目标地址 转发表 SDN方式基于多个字段流表 控制平面: 调…

第10届蓝桥杯Scratch省赛真题集锦

编程题 第 1 题 问答题 击鼓游戏 题目说明 准备工作: 将复台背景设置为“spotight-stage”&#xff0c;添加一个“Belerina"角色、两个“Drum1"角色和两个“Drum2”角色&#xff0c;并按照图 7-1 的位置摆放。角色“Beleina"的造型和颜色的设置须如图 7-1所示&a…

美女放电还是整形-从《人月神话》误译谈状态机图

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 在重审《人月神话》中译本的过程中&#xff0c;发现一处较严重的误译。 原文是&#xff1a; the first milepost is not reached until two months have elapsed. 原译为&#xff1a; 两个月…

Java中常量基础知识

1 问题 什么是字面常量&#xff1f; 2 方法 拿第一行输出语句来说&#xff0c;这行代码输出了 “hello” 这个字符串&#xff0c;无论何时何地运行程序&#xff0c;输出的这个字符串都不会变&#xff0c;这就是字面常量。 定义&#xff1a;常量即程序运行期间&#xff0c;固定不…

chatgpt网站优选集合

目录 chatGpt 国内镜像网站集合 chatgpt接入微信 chatgpt接入谷歌浏览器 chatgptAI绘画 最后 chatGpt 这个说实话&#xff0c;不用我介绍大家也都懂。不如玩一个有意思的&#xff0c;这里我让chatGpt自己介绍一下他自己&#xff1a; 嗨&#xff0c;大家好&#xff0c;我是…

C++ [STL之vector模拟实现]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT STL之vector模拟实现 前言正文空间结构默认成员函数构造函数拷贝构造函数赋值重载析构函数关于数据拷贝问题 迭代器容量操作查询容量容量操作 数据访问下标访问头尾数据访问 数据增删尾插尾删重…

学懂缓存雪崩,缓存击穿,缓存穿透仅需一篇,基于Redis讲解

在了解缓存雪崩、击穿、穿透这三个问题前&#xff0c;我们需要知道为什么我们需要缓存。在了解这三个问题后&#xff0c;我们也必须知道使用Redis时&#xff0c;如何解决这些问题。 所以我将按照"为什么我们需要缓存"、"什么是缓存雪崩、击穿、穿透"、&qu…

Linux学习笔记 --- Linux基础命令Part1

一. Linux的目录结构 目标&#xff1a;1. 掌握Linux系统的目录结构 2. 掌握Linux系统的路径表达形式 1.1 Linux系统的目录结构 我们知道&#xff0c;在操作系统中&#xff0c;文件系统的目录结构一般都是树形结构。Linux的目录结构是一个树型结构Windows 系统可以拥有多…

如何使用wireShark抓取还原文件

简介 WireShark的追踪流功能可以帮我们抓取从网络上下载的各种文件&#xff0c;接下来就演示下如何抓取并且进行还原。 使用Nginx搭建文件存储服务器 只要是通过http网站下载的包&#xff0c;都可以通过追踪流工具进行抓取。这里为了演示&#xff0c;临时搭建一个Nginx文件存…

Yolov8涨点技巧:MobileViTAttention助力小目标检测,涨点显著,MobileViT移动端轻量通用视觉transformer

在​crack缺陷检测项目原始0.739提升至 0.772 ,涨点明显,博主多个数据集亲测有效,实现暴力涨点; 现有博客都是将MobileViT作为backbone引入Yolov5,因此存在的问题点是训练显存要求巨大,本文引入自注意力的Vision Transformer(ViTs):MobileViTAttention 1. MobileViT介绍…

English Learning - L3 作业打卡 Lesson3 Day18 2023.5.22 周一

English Learning - L3 作业打卡 Lesson3 Day18 2023.5.22 周一 引言&#x1f349;句1: People said my mother was “a good egg”.成分划分弱读连读语调 &#x1f349;句2: She would always help anyone in need.成分划分连读语调 &#x1f349;句3: We never had to “walk…

1、MQTT协议入门以及mosquitto示例

1.什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的"轻量级"通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xf…