排序(2)——希尔排序

希尔排序(缩小增量排序)

基本思想

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。

  • 希尔排序:①预排序 + ②直接插入排序

预排序:分别对每个分组进行插入排序。

  • 首先要设置一个gap,如果gap=3,也就是3个间隔的数为一组。
  • 这里我们看升序。预排序就是要让大的数更快的到达后面,小的数更快的到达前面。
  • 预排序结束后,大的数都在后面,小的数都在前面,就已经基本有序了。

整体思想

  • 一趟:类似直接插入排序的一趟,间距是gap,(直接插入排序的间距为1)相当于把直接插入排序的1都改为gap。
  • 一组:加入循环,完成一组的排序(类似直接插入排序整体)
  • 多组:加入三层嵌套循环/多组并排。(完成多组排序)gap即为组数。
  • 整体:完成整个数组的排序(多次预排序直到最后插入排序gap=1)(n个值)gap=n(gap=gap/2或者gap=gap/3+1)

gap

  • gap的值越大,大的值更快的调到后面,小的值可以更快的调到前面,越不接近有序。
  • gap的值越小,大的值更慢的调到后面,小的值可以慢的调到前面,越接近有序。
  • gap>1时时预排序,目的是让整体数值更加接近有序
  • gap == 1的时候就是直接插入排序,目的是让整体值有序。
  • 无论gap是多少,它gap=gap/2后一定会等于1。
  • 无论gap是多少,它gap=gap/3+1后一定会等于1。(预排次数少一点)
  • gap的值不是固定的,gap的值是随着整体n的大小变化而变化的。

一定要保证最后一次是1。这样才能让最后一次循环是直接插入排序,从而达到希尔排序的效果,使整体有序。

代码实现 

【预排序】

单组

for (int i = 0; i < n - gap; i+=gap)
{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;
}

如果是👇,会有什么错误?

for (int i = 0; i < n; i+=gap)

会出现越界,因为当i加到一组中的最后一个的时候,此时end=i,就没有end+gap了。

多组

如果想要实现多趟,就再套一个循环即可。

  • 已知gap是指间隔,也就是说一共会有gap组,所以我们可以实现

方法一:三层循环(一组一组排)

//多趟
for (int j = 0; j < gap; ++j){//每组for (int i = j; i < n-gap; i += gap){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;}}

方法二:多组并排

  •  也就是让end在几组之间反复跳跃,第一组->第二组->第三组->第一组->第二组...
  • 我们只需要把i的值改一下就可以了,改为i++,每次+1。这样就可以实现依次在每一个组里反复横跳了。

//多组并排
void ShellSort(int* a, int n)
{//多组int gap = 3;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;}
}

【直接插入排序】

如果整体的数量过大,gap为3是非常不合适的。所以,gap不可能为固定值,gap的取值是随着n变化的,所以gap有两种方式去取值。

  • 只需要控制gap的值,使其最后一次循环为1,这样就可以达到直接插入排序。(直接插入排序的gap为1)
  • 随着gap的变小,组数会变小,每组里面的数值个数会变大。
void ShellSort(int* a, int n)
{//整体int gap = n;while (gap > 1){//每组//gap = gap / 2;gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];//一趟while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else//<={break;}}a[end + gap] = tmp;}}
}

特性总结

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

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

3. 稳定性:不稳定 

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

《数据结构(C语言版)》--- 严蔚敏

《数据结构-用面相对象方法与C++描述》--- 殷人昆

时间复杂度

O(N^1.3)

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

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

相关文章

Linux - 基本背景

1、linux发展史 1.1、UNIX发展历史 1968年&#xff0c;一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念。1969&#xff0d;1970年&#xff0c;AT&T的贝尔实验室研究…

[SD] 安装使用stable diffusion webui

1.下载基础版本并解压&#xff1a; https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases/download/v1.0.0-pre/sd.webui.zip 2.运行update.bat 这步的目的是升级到最新版本&#xff0c;并下载相应的依赖库。 这步可能会提示某些git仓库无法clone到本地&#…

[工具探索]-Gitlab的CI/CD操作

在 GitLab 中&#xff0c;CI&#xff08;持续集成&#xff09;是一项强大的功能&#xff0c;它允许你自动化构建、测试和部署你的代码。 在 GitLab CI/CD 中&#xff0c;.gitlab-ci.yml 文件是用于定义构建和部署流程的配置文件。它使用一种基于 YAML 的语法。 下面是一个简单…

dp——路径距离

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 01 62. 不同路径02 63. 不同路径 II03 64. 最小路径和04 72. 编辑距离05 120. 三角形最小路径和06 124. 二叉树中的最大路径和07 174. 地下城游戏08 514. 自由之路09 576. 出界的路径数10 931. 下降路径最小和11 13…

AcWing 1229. 日期问题 解题思路及代码

先贴个题目&#xff1a; 以及原题链接&#xff1a;1229. 日期问题 - AcWing题库https://www.acwing.com/problem/content/1231/ 这题其实和之前的回文日期相似&#xff0c;可以直接暴力枚举&#xff0c;然后得解&#xff0c;放个小片段&#xff1a; for (int date 19600101; …

UI自动化-(web端下拉选择框弹出框滚动条操作-实操入门)

1、下拉选择框操作 在 UI 自动化中,操作下拉选择框可以通过以下步骤进行: 定位下拉选择框元素:通过适当的元素定位方法,找到下拉选择框的元素。打开下拉框:例如通过点击(.click)来操作下拉框元素打开下拉框。选择选项:可以通过以下几种方式选择下拉框中的选项:根据索…

uni-app 页面跳转动画

API的方式 uni.navigateTo({url: ../test/test,animationType: pop-in,animationDuration: 200 }); uni.navigateBack({delta: 1,animationType: pop-out,animationDuration: 200 });pages.json中配置的方式 "style": {"app-plus": {"animationType…

【代码学习】pytorch_lightning

在Follow别人工作时&#xff0c;经常发现别人使用pytorch_lightning模板&#xff0c;比如这篇分布式信源信道联合编码工作就是用了lightning-hydra-template模板&#xff0c;有必要学习下这个框架。

高级语言期末2009级A卷(计算机学院)

1.编写bool函数&#xff0c;判定给定的正整数n&#xff0c;M是否满足&#xff1a;M为n的质因数&#xff08;能整除n的质数&#xff09; #include <stdio.h> #include <stdbool.h> #include <math.h>bool Isprime(int n) {if(n<1)return false;for(int i2…

时隔n年再度会看Vue,Git

时隔n年再度会看Vue,Git 曾经沧海难为水&#xff0c;除却巫山不是云。不知道这句话用在这里合不合适&#xff0c;好多东西在记忆中都淡化了。但是互联网确是有记忆的。研究以前项目的时候&#xff0c;翻看到gitee码云上托管的项目&#xff0c;就像是自己的孩子重新又回来了一样…

突破编程_C++_面试(异常处理)

面试题 1 &#xff1a;什么是异常处理&#xff1f;为什么需要它&#xff1f; 在C中&#xff0c;异常处理是一种处理程序运行时错误的机制。它允许程序员在程序的某个部分中定义和处理可能会出现的异常情况&#xff0c;即“异常”。这些异常情况通常是由错误条件、非法操作或其…

Laravel Octane 和 Swoole 协程的使用分析

之前在工作中使用 Laravel Octane 的 concurrently 处理并发时&#xff0c;发现在队列和定时任务中不会触发并发效果。经过分析&#xff0c;作了如下猜测&#xff1a;队列和定时任务都属于一个独立的进程&#xff0c;与 Octane 服务无关&#xff0c;而 Octane concurrently 恰恰…

C#高级:DataGridView的详解

一、每条数据增加一个按钮&#xff0c;点击输出对应实体 请先确保正确添加实体的名称和文本&#xff1a; private void button6_Click(object sender, EventArgs e) {//SQL查询到数据&#xff0c;存于list中List<InforMessage> list bll.QueryInforMessage();//含有字段…

数据页和缓存页(BufferPool)

1. 数据页&#xff08;dataPage&#xff09; 什么是数据页&#xff1f; 数据页是 MySQL 存储引擎在磁盘和内存之间传输数据的基本单位&#xff0c;默认大小为16KB。 数据页的结构&#xff1a; 表头&#xff1a;储存与页相关的元信息&#xff0c;比如&#xff0c;页号&#…

buuctf_reverse_新年快乐+内涵的软件

新年快乐 题目&#xff1a;新年快乐.exe 这玩意有壳&#xff01;我去down了upx脱壳 开始放exeinfope的图片没截&#xff0c;我记得下载完upx后exeinfoPE显示还不一样。留了一张脱壳的实验图片&#xff1a; 然后放IDA 我是笔记本键盘&#xff0c;shiftFnF12转字符串 诶呦&…

flutter 安装流程

flutter文档 0.安装flutter https://flutter.cn/docs/get-started/install/windows/desktop?tabdownload 1.jdk 安装地址 Java Archive | Oracle 2. android studio 下载地址 https://developer.android.com/studio 3.Visual Studio下载地址 下载 Visual Studio Tools …

C++之map

1、map介绍 map是C STL的一个关联容器&#xff0c;它提供一对一的数据处理能力。其中&#xff0c;各个键值对的键和值可以是任意数据类型&#xff0c;包括 C 基本数据类型&#xff08;int、double 等&#xff09;、使用结构体或类自定义的类型。 第一个可以称为关键字(key)&…

docker构建hyperf环境

一&#xff0c;构建hyperf 镜像 官网git https://github.com/hyperf/hyperf-docker 使用dockerfile构建镜像 根据需要这里我使用8.1 swoole版本的镜像 在/home/hyperfdocker 目录中新建一个Dockerfile文件&#xff0c;将这个git上的Dockerfile内容复制粘贴进去 docker build…

HBase总结

基本介绍 特点(高可靠、高性能、面向列、可伸缩) 非关系型数据库大数据实时处理 表规模达数十亿行及数百万列读、写访问可实时分布式存储系统 HDFS(Hadoop Distributed File System)文件存储ZooKeeper作为协同服务列存储 优点:有利于单列数据查询缺点:整行读取时效率较慢,…

毫末智行开年融资,揭幕了自动驾驶最后的赛点

毫末智行日前官宣拿到的超亿元B1轮融资&#xff0c;在行业引起了不小的关注。 一方面是信心问题&#xff0c;自动驾驶从早期拼技术到去年拼量产落地&#xff0c;创业公司们的声量此消彼长&#xff0c;有人领先也有人掉队&#xff0c;但市场的态度都以谨慎为主&#xff0c;甚至…