[数据结构]插入和希尔排序

一、插入排序

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

1.实现思路:

1.将第一待排序序列第一个元素看做一个有序序列。

2.把第二个元素到最后一个元素当成是未排序序列。

3.从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

动图演示:

动图来源:1.3 插入排序 | 菜鸟教程 (runoob.com)

代码实现:

void InsertSort(int* a, int n)
{for (int i = 0; i < n-1; i++){// [0, end] end+1int 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.来源:

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。希尔排序是记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

————《百度文库》

2.基本思想:

先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

3.实现方式:

① 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。
② 所有距离为d1的倍数的记录放在同一个组中,在各组内进行直接插入排序。
③ 取第二个增量d2小于d1重复上述的分组和排序,直至所取的增量dt=1(dt小于dt-l小于…小于d2小于d1),即所有记录放在同一组中进行直接插入排序为止。

4.希尔排序的特性总结:

1. 希尔排序是对直接插入排序的优化。
2. gap > 1 时都是预排序,目的是让数组更接近于有序。当 gap == 1 时,数组已经接近有序的了,这样就
会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
3. 希尔排序的时间复杂度不好计算,因为 gap 的取值方法很多,导致很难去计算,因此在好些树中给出的
希尔排序的时间复杂度都不固定:
《数据结构 (C 语言版 ) --- 严蔚敏

由于动图没找到,这里我就画图描述一下吧,.

现在我们有如下数据:

我们先选

gap=8;

第一趟排序:

然后

gap=gap/3+1--->gap=3

第二趟排序:

接着

gap=gap/3+1--->gap=2

第三趟排序:

最后

gap=gap/3+1--->gap=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.mzph.cn/news/778181.shtml

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

相关文章

Protocol Buffers(通常简称为protobuf)是一种由Google开发的用于序列化结构化数据的接口描述语言

Protocol Buffers&#xff08;通常简称为protobuf&#xff09; protobuf是一种由Google开发的用于序列化结构化数据的接口描述语言。它可以用于通信协议、数据存储等领域。以下是protobuf的一些重要特点和概念&#xff1a; IDL&#xff08;接口描述语言&#xff09;&#xff1…

win10微软拼音输入法 - bug - 在PATH变量为空的情况下,无法输入中文

文章目录 win10微软拼音输入法 - bug - 在PATH变量为空的情况下&#xff0c;无法输入中文概述笔记实验前提条件100%可以重现 - 无法使用win10拼音输入法输入中文替代的输入法软件备注END win10微软拼音输入法 - bug - 在PATH变量为空的情况下&#xff0c;无法输入中文 概述 在…

Python数据可视化:用Matplotlib和Seaborn绘制精美图表

Python数据可视化&#xff1a;用Matplotlib和Seaborn绘制精美图表 数据可视化是数据分析中的重要环节&#xff0c;它能够帮助我们以直观的方式理解数据和分析结果。Python中的Matplotlib和Seaborn库是两个非常强大的数据可视化工具&#xff0c;它们提供了丰富的功能来创建各种…

FastAPI+React全栈开发12 搭建FastAPI开发环境

Chapter03 Getting Started with FastAPI 12 Technical requirements FastAPIReact全栈开发12 搭建FastAPI开发环境 For this chapter, you will need the following: Python setupVirtual environmentsCode editor and pluginsTerminalREST clients 对于这一章&#xff0…

Day54:WEB攻防-XSS跨站Cookie盗取表单劫持网络钓鱼溯源分析项目平台框架

目录 XSS跨站-攻击利用-凭据盗取 XSS跨站-攻击利用-数据提交 XSS跨站-攻击利用-flash钓鱼 XSS跨站-攻击利用-溯源综合 知识点&#xff1a; 1、XSS跨站-攻击利用-凭据盗取 2、XSS跨站-攻击利用-数据提交 3、XSS跨站-攻击利用-网络钓鱼 4、XSS跨站-攻击利用-溯源综合 漏洞原理…

OpenCV摄像头和视频处理

OpenCV视频捕获 一、引言 视频捕获是计算机视觉中常见的一项任务&#xff0c;它涉及从视频文件或摄像头实时流中读取帧&#xff0c;并对其进行处理和分析。OpenCV&#xff08;开源计算机视觉库&#xff09;为视频捕获提供了强大的支持&#xff0c;使得这一任务变得简单高效。…

计算机网络链路层

数据链路 链路是从一个节点到相邻节点之间的物理线路&#xff08;有线或无线&#xff09; 数据链路是指把实现协议的软件和硬件加到对应链路上。帧是点对点信道的数据链路层的协议数据单元。 点对点信道 通信的主要步骤&#xff1a; 节点a的数据链路层将网络层交下来的包添…

深度学习pytorch——卷积神经网络(持续更新)

计算机如何解析图片&#xff1f; 在计算机的眼中&#xff0c;一张灰度图片&#xff0c;就是许多个数字组成的二维矩阵&#xff0c;每个数字就是此点的像素值&#xff08;图-1&#xff09;。在存储时&#xff0c;像素值通常位于[0, 255]区间&#xff0c;在深度学习中&#xff0…

重写、重定义(隐藏)、重载区别

1、重载是在同一个作用域中比如在同一个类中、函数名一样参数不同 2、重写&#xff1a; 满足多态的条件&#xff1a;&#xff08;1&#xff09;虚函数前面带有virtual函数名、返回值、参数相同&#xff08;2&#xff09;重写函数体 3、重定义也叫隐藏、不满足重写的就是重定义

素描石膏像的眼睛:传神的关键

素描石膏像的眼睛&#xff1a;如何在素描绘画中画出眼睛的传神&#xff1f;关键要点是什么 在素描石膏像的眼睛时&#xff0c;要画出传神的效果&#xff0c;关键要点包括以下几个方面&#xff1a; 理解眼睛的结构&#xff1a;首先&#xff0c;需要理解眼睛的基本结构&#xff…

SlerfTools:简化操作,激发Solana生态创新潜能

在区块链世界的快速演变中,Solana生态系统以其独特的高性能吸引了全球的目光。然而,随着生态系统的蓬勃发展,用户和开发者面临的挑战也日渐增多。正是在这样的背景下,一个名为SlerfTools的新星项目应运而生,它承诺将为Solana带来一场革命性的变革。 项目的诞生 SlerfTools并非…

前端学习-CSS基础-Day3

一、CSS三大特性 1.1层叠性 相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要解决样式冲突的问题 层叠性原则&#xff1a; 1.样式冲突&#xff0c;遵循的原则是就近原则&#xff0c;哪个样式离结构近&a…

【QT+QGIS跨平台编译】043:【libprotobuf-lite+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、libprotobuf-lite介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libprotobuf-lite介绍 libprotobuf-lite 是 Protocol Buffers 的 C++ 轻量级运行时库,专门设计用于在资源受限的环境下使用。与标准的 libprotobuf(Protocol Buffers…

数据结构——AVL树详解

一、AVL树的定义 AVL全称叫做平衡二叉搜索&#xff08;搜索&#xff09;树&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年发明了一种方法&#xff1a; 当向二叉搜索树中插入新结点后&#xff0c;如果能保证每个结点的左右子树高度之差的绝对值不超…

最近公共祖先(lca)倍增算法【模板】

P3379 【模板】最近公共祖先&#xff08;LCA&#xff09; - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> #include<cstdio> using namespace std; const int N5e5100; const int inf0x3f3f3f; int n,m,s; vector<int>g[N]; int dep[…

halcon例程学习——ball.hdev

dev_update_window (off) dev_close_window () dev_open_window (0, 0, 728, 512, black, WindowID) read_image (Bond, die/die_03) dev_display (Bond) set_display_font (WindowID, 14, mono, true, false) *自带的 提示继续 disp_continue_message (WindowID, black, true)…

目标检测的相关模型图:YOLO系列和RCNN系列

目标检测的相关模型图&#xff1a;YOLO系列和RCNN系列 前言YOLO系列的图展示YOLOpassthroughYOLO2YOLO3YOLO4YOLO5 RCNN系列的图展示有关目标检测发展的 前言 最近好像大家也都在写毕业论文&#xff0c;前段时间跟朋友聊天&#xff0c;突然想起自己之前写画了一些关于YOLO、Fa…

货币系统(闫氏DP分析法)

题目描述&#xff1a; 给定 V 种货币&#xff08;单位&#xff1a;元&#xff09;&#xff0c;每种货币使用的次数不限。 不同种类的货币&#xff0c;面值可能是相同的。 现在&#xff0c;要你用这 V 种货币凑出 N 元钱&#xff0c;请问共有多少种不同的凑法。 输入格式&am…

C语言 C6031:返回值被忽略:“scanf“ 问题解决

我们在代码中 直接使用 scanf 就会出现这个错误 在最上面 加上 #define _CRT_SECURE_NO_WARNINGS//禁用安全函数警告 #pragma warning(disable:6031)//禁用 6031 的安全警告即可正常运行

llama-index 结合chatglm3-6B 利用RAG 基于文档智能问答

简介 llamaindex结合chatglm3使用 import os import torch from llama_index.core import VectorStoreIndex, ServiceContext from llama_index.core.callbacks import CallbackManager from llama_index.core.llms.callbacks import llm_completion_callback from llama_ind…