希尔排序

C++ 希尔排序 希尔排序的原理: (1)首先,从数组的首元素开始每隔“步长(间隔)”个元素就挑选一个元素出来作为子数组元素。 (2)然后每个子数组各自进行比较,比较好后,每个子数组都有顺序,进入下一轮,步长(间隔)减少, 再根据步长(间隔)分组进行比较。 (3)重复以上操作,最后就有顺序了。 #include <iostream> #include <stdlib.... 阅读详情

基本思想:希尔排序可以说实际上是直接插入排序的一种改进,具体思想是将N个元素的无序数列进行分组,分割成若干个子序列,然后在这每个子序列中进行直接插入排序,(直接插入排序对已经基本有序或是待排序数列元素个数很少时是非常高效的,这也正是希尔排序的精妙之处),当整个序列基本有序时,在对整个序列进行一次直接插入排序。

时间复杂度:n*log(n)  这个和增量gap的取值有关  

空间复杂度:O(1)

是否是稳定排序:不是稳定排序

代码示例:

#include <stdio.h>

int println(int array[], int len)
{
    int i = 0;
    int ret = (array != NULL) && (len >= 0);
    
    if(ret)
    {
        printf("array[]: ");
        for(i=0; i<len; i++)
        {
            printf("%d ", array[i]);
        }
        
        printf("\n");
    }
    
    return ret;
}


int ShellSort(int array[], int len) // O(n*n)
{
    
    int i = 0, j = 0;
    int gap = len;
    int temp = 0;//定义一个变量保存缓存值
    int k = 0;
     
    int ret = (array != NULL) && (len >= 0); 
    
    if(ret)
    {
        //这里用do-while循环,代码更简洁 
        do{
            //这里取间距为3,gap == 1是就相当于对整个序列进行一次插入排序
            gap = gap/3 + 1;//据说gap为3效率比较高,有待论证 
            
            for(i = gap; i < len; i += gap)//先以gap间距分组
            {
                k = i;//待比较数据下标,分组内每完成一趟直接插入排序 更新K值       
                temp = array[k];//先将array[i]的值保存起来 
                      
                //temp = array[i];//直接这样会出错???
                //原因很简单,就是第一次直接插入排序要记录待插入的位置
                //如果不记录,k的初值被初始化为0而一开始key值是gap位置 
                
                //然后在每个分组内进行直接插入排序,原来的配方,原来的味道 
                for(j = i - gap; (j >= 0) && (array[j] > temp); j -= gap)
                {
                    //1. 挪数据
                    array[j+gap] = array[j];                 
                    //2. 记录待插入位置 
                    k = j;
                }
                //将待插入位置插入合适的位置 
                array[k] = temp;              
            } 
                       
        }while(gap > 1);
    }
        
    return ret;
}

int main()
{
    int array[] = {3, 8, 7, 1, 9, 2, 17, 4, 2, 13, 6};

    int len = sizeof(array) / sizeof(*array); 
    
    println(array, len);
    
    ShellSort(array, len);
    
    println(array, len);
    
    printf("Press enter to continue ...");
    getchar();
    
    return 0;
}

运行效果截图:



总结:发现把算法思路反复的琢磨,把代码撸出来也没那么难!而且通过总结还能更加深刻的理解算法的精妙之处。

SAP SD POD 配置与 VLPOD 操作:3步解决发货10件开票7件的业务场景 本文详细解析了SAP SD POD功能在解决发货与开票数量差异中的应用,通过3步配置法实现精准匹配。重点介绍了POD核心逻辑、关键配置步骤及VLPOD操作技巧,帮助企业高效处理易损品运输等复杂场景,提升供应链管理效率。 阅读详情

相关推荐

Unity中实现FairyGUI弹窗背景模糊的3种方法对比(附完整代码)

本文详细对比了Unity中实现FairyGUI弹窗背景模糊的3种方法,包括FairyGUI原生滤镜方案、多摄像机混合渲染方案和渲染纹理动态混合方案。每种方法均附有完整代码示例,帮助开发者根据项目需求选择最佳方案,实现镜头虚化模糊效果,提升游戏UI的视觉沉浸感。

ff678的博客 230

希尔排序原理

3、其实预排序的实现和直接插入排序的过程几乎是完全相似,前面也说了当希尔排序的缩小增量为1时,和插入排序没区别,也就是说,插入排序每次都对相邻的数据处理,而希尔排序是将分好的组看成新的数组,例如上面数据的6, 2, 3为一组,我们可以看成其他的数据不存在,只有这一组存在,那么对于这一组而言,希尔排序就是插入排序,将上图的三组都排完序,这一趟预排序就算完成了。2、已排序区数组元素加一,待排序区首元素变为3,end也变为3的下标,tmp记录此元素的值,将tmp与已排序区元素进行比较,首先与5比较,小于5。

欢迎来到阿熊的blog~~ 2271

【MNE脑电信号处理学习笔记1】数据的读取、可视化、剪裁、滤波和保存

MNE之读取原始数据、可视化数据、剪裁数据、滤波和保存 Reading & visualizaing raw data, cropping, filtering, and saving 原视频教程:Pybrain: M/EEG analysis with MNE Python 原笔记和材料:pybrain_mne 本文根据视频和个人理解对原笔记进行细微修改。 Import the few packages we’ll need import matplotlib import pathlib i

小白家 4214

java希尔排序(含希尔排序代码)

希尔排序原理 希尔排序为啥比插入排序效率高 希尔排序的代码详解

qq_56127002的博客 5194

Zotero PDF Translate插件实战:DeepL API免费申请与高效翻译配置指南

本文提供Zotero PDF Translate插件配置DeepL API的完整实战指南。详细介绍了如何免费申请DeepL API密钥,解决国内访问问题,并在插件中完成精细配置,实现文献阅读时的无缝划词翻译,大幅提升科研人员和学生的英文文献阅读效率。

rum55的博客 455

别再死记硬背了!用‘瞬时极性法’5分钟搞定三极管反馈电路类型判断

本文介绍了使用‘瞬时极性法’快速判断三极管反馈电路类型的高效技巧。通过假设输入信号变化并追踪传递路径,该方法能准确区分正负反馈、电压电流反馈、串联并联反馈及交直流反馈,避免传统死记硬背的弊端,显著提升电路分析效率。

weixin_42524708的博客 181

希尔排序详解

八大排序算法中,有两种插入排序,直接插入排序和希尔排序,下面我们来介绍希尔排序。 希尔排序 希尔排序又叫做缩小增量排序。 1、基本思想 设待排序元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为increment个子序列,所有距离为increment的元素放在同一个子序列中,在每一个子序列中分别实行直接插入排序。然后缩小间隔increment,重复上述子序列划分和...

星空 4895

高数 | 【极限与等价无穷小】两个重要极限 & 经典错误 & 什么情况下求极限可以直接带入

一. 第一个重要极限 二. 第二个重要极限 三. 导数定义式 全文见【高等数学】两个重要的极限 - 知乎

"You are worthy! You can do it!" 6万+

Java实现希尔排序

1 问题描述 给定一组数据,请使用希尔排序获取这组数据的非降序序列。 2 解决方案 2.1 希尔排序原理简介 希尔排序的实质...

5502

Python爬虫实战:利用Requests-HTML与异步技术高效爬取B站视频信息及弹幕数据分析

B站的弹幕,远非简单的评论功能,它是一种独特的、实时互动的社交方式,是观众情感的集体宣泄和共鸣。无论是用于内容创作者优化视频结构,还是用于社会学、传播学的研究,亦或是简单的个人兴趣分析,都具备极高的价值。stop_words = {'的', '了', '是', '我', '你', '他', '她', '它', '在', '有', '不', '吗', '吧', '啊', '这', '那'}本文不仅是代码的堆砌,更注重原理的剖析、反爬策略的应对以及工程化的思考,旨在为读者提供一份紧跟技术前沿的实战指南。

2201_76125261的博客 389

kaggle学习笔记-餐厅数据挖掘

分析Zomato数据集的基本思想是为了公平地了解影响在班加罗尔不同地方建立不同类型餐厅的因素,每个餐厅的总评级,班加罗尔是这样一个城市,拥有超过12,000家餐厅,餐厅供应来自世界各地的菜肴。每天都有新的餐馆开业,这个行业还没有饱和,需求也在与日俱增。然而,尽管需求不断增加,新餐馆却很难与老牌餐馆竞争。大多数餐厅都供应同样的食物。班加罗尔是印度的IT之都。这里的大多数人主要依靠餐馆的食物,因为他们没有时间自己做饭。由于对餐馆的需求如此巨大,因此研究一个地方的人口统计学就变得很重要。

优快云XXCQ的博客 1862

希尔排序增量怎么确定_排序算法之希尔排序

本文将介绍排序算法中的希尔排序,它是高级版的插入排序,是我们第一个介绍的有点难度的算法。1 实例讲解希尔排序,是插入排序的一个升级版本。在插入排序中,无论数据是怎么分布的,依然循规蹈矩的一步一步比较,移动,插入。在希尔排序中,采用跳跃式的方式,按照某个增量gap将数组元素分成多组序列,并使用插入排序使得各自组内有序。随后逐步缩小gap,继续按组进行插入排序,直到增量为1。这样做的目的是使得数组整体...

weixin_39955925的博客 2745

基于sklearn实现LDA主题模型(附实战案例)

目录LDA主题模型1.LDA主题模型原理2.LDA主题模型推演过程3.sklearn实现LDA主题模型(实战)3.1数据集介绍3.2导入数据3.3分词处理 3.4文本向量化3.5构建LDA模型3.6LDA模型可视化 3.7困惑度 其实说到LDA能想到的有两个含义,一种是线性判别分析(Linear Discriminant Analysis),一种说的是概率主题模型:隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA)。 现在讨论的是主题模型

m0_64336780的博客 2万+

希尔排序的理解

0.思考 相比于直接插入排序和折半插入排序,有没有可以继续提高效率的方法? 将要移动的元素移动一大步,即让它离排序完成后的最终位置更近一些。 想办法让我们在直接插入排序的时候,使得序列基本有序、个数较少并且当比较一次时,移动一大步,这就是希尔排序思想的出发点。 1.希尔排序 1.1希尔排序的基本思想 先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中...

neverthe的博客 2037

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

排序之希尔排序

希尔排序思想 希尔排序对要排序的数字进行分组,在组内进行排序。排序完成需要进行多次分组,每次分组的个数是前一次分组个数的一半。 图示 以 [3290615487] 该数组为例从小到大进行排序。 1. 首先将该组数字进行分组,首次分组的个数为数组长度除以2,即 10 / 2 = 5 组,下面相同颜色的为一组(即同一组内数字之间的下标的距离为组的个数)...

Coding的博客 930

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java排序之希尔排序

希尔排序 引入:前面的博客已经讲了插入排序,插入排序的思想是将一个待排序数组分成有序和无序的两部分,每次从无序部分中选择一个数插入到有序组数中合适的位置,由于每次插入的过程中都要和已经有序中的数作比较,来确定合适的插入位置,因此当插入的数较小时,那么就会和前面已经有序的数比较的次数较多,因此针对插入排序的缺点,提出了希尔排序。下面将着重讲解希尔排序的思想和原理实现过程。 希尔排序思想:希尔排序又称缩小增量排序,它的基本思想是将待排序数分成若干组,对每一组采用直接插入排序,再将排好序的若干组再分组,并且每次分

Waiting的博客 190

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: 快速排序
下一篇: 归并排序
coding__madman
博客等级 码龄11年 188粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值