Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >什么是希尔排序?

什么是希尔排序?

作者头像
跋扈洋
发布于 2022-12-03 01:42:29
发布于 2022-12-03 01:42:29
34700
代码可运行
举报
文章被收录于专栏:物联网知识物联网知识
运行总次数:0
代码可运行

介绍

希尔排序又称缩小增量排序,基本思想为:先将待排序列分割成若干子表,把相隔某个增量的记录组成一个子表,对各个子表分别进行直接插入排序,当整个表已基本有序的时候,再对整个表进行一次直接插入排序。

希尔排序的过程如下:先取一个小于n的步长d1,把表中的全部记录分成d1组,所有距离为d1的倍数的记录放在同一组,在各组内进行直接插入排序;然后取第二个步长d2<d1,重复上述过程,直到所得到的dt=1,即所有记录已放在同一组中,在进行直接插入排序,由于此时已经具有较好的局部有序性,故可以很快得到最终结果。 希尔排序的时间复杂度大概在O(n^1.3),在最坏的情况下会到达 O( n^2 )。

算法实现

实现方法1(我编写的我认为容易理解的希尔排序实现算法)

我们初始时,令增量d为数组大小的一半,之后每次增量折半,直到小于1的时候,会停止。也就是最后一次循环时,增量为1,相当于直接插入排序,但此时因为已经基本有序,所以移动的元素非常少了。

每个增量dt将元素分成dt组,每组的元素进行直接排序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <windows.h>
#include <stdint.h>
void Hill_sort(int a[],int size);
int main()
{
    int k;
    int num[9]={9,8,7,4,6,5,1,2,3}; 
    int sortsize=sizeof(num)/sizeof(num[0]);
    Hill_sort(num,sortsize);
    for(k=0;k<sortsize;k++)
    printf("%d\n",num[k]);
    system("pause");
    return 0;
}
void Hill_sort(int a[],int size)
{
    int i,j,k;
    int d;
    int temporary;
    for(d=size/2;d>=1;d=d/2)
    {
      printf("\nd=%d:",d);
      for(k=0;k<d;k++)
        for(i=k;i<size;i+=d)
        {
              printf("\ni=%d:",i);
            temporary=a[i];
            for(j=i-d;a[j]>temporary&&j>=0;j=j-d)
            {
                a[j+d]=a[j];
                printf("j=%d;",j);
            }
            a[j+d]=temporary;
         
        }
    }
}

实现效果

上述程序是我按照我的思路写的,我认为是最容易理解,但效率不是最高的,程序中使用了四重循环。

实现方法2(网络上最常见的希尔排序算法)

网络上最常见的希尔排序算法的实现,如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void shell_Sort(ElemType A[],int n)
{
  int i, j, dk;
  for (int dk = n / 2; dk >= 1; dk--)
    for(int i=dk+1;i<=n;i++)
      if (A[i] < A[i - dk])
      {
        A[0] = A[i];
      }
  for (int j = i - dk; j > 0 && A[0] < A[j]; j -= dk)
    A[j + dk] = A[j];
  A[j + dk] = A[0];
}

扩展

数据结构或者说算法,只要理念是一样的,实现方法因人而异,我们不需要纠结到底哪一个效率最高,因为只要是按照此算法理解实现的程序,大致的算法时间复杂度都大同小异,关键是我们是否能学会此算法,而判断我们学会算法的标准就是自己能写出符合此算法思路的实现程序,如果能和网络上其他人写的不一样,反而是一种好事。所以读者可以仔细理解一下上面的两个程序,来理解一下希尔排序的理念和优点。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 物联网知识 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
☀️苏州程序大白一文教你学会微信小程序开发☀️《❤️记得收藏❤️》
3、与data同级 并且可以将input中输入的值与data中定义的属性绑定,使用this.setData({属性:e.detail.value})。
苏州程序大白
2021/09/29
1K0
【2万字长文】深入浅出主流的几款小程序跨端框架原理
https://juejin.im/post/6881597846307635214
桃翁
2020/10/23
2.5K1
【2万字长文】深入浅出主流的几款小程序跨端框架原理
5分钟入门 - 微信小程序开发
如果你还没有微信公众平台的账号,请先进入 微信公众平台 首页,点击 “立即注册” 按钮进行注册。注册的账号类型可以是订阅号、服务号、小程序以及企业微信,我们选择 “小程序” 即可。
用户6808043
2022/02/25
9240
关于小程序的基础库
原文链接:https://godbasin.github.io/2018/09/23/wxapp-basic-lib/
李成熙heyli
2018/11/14
8.8K0
关于小程序的基础库
京东京喜小程序的高性能打造之路
京喜小程序自去年双十一上线微信购物一级入口后,时刻迎接着亿级用户量的挑战,细微的体验细节都有可能被无限放大,为此,“极致的页面性能”、“友好的产品体验” 和 “稳定的系统服务” 成为了我们开发团队的最基本执行原则。
winty
2020/04/01
2.7K0
【小程序】384- 如何一人五天开发完复杂小程序(前端必看)
自定义导航栏布局下,我们可以完全控制导航栏样式,赋予导航栏更多交互及 UI 设计上的可能。如上图所示,Readhub 在导航栏中加入了设置按钮,喜茶在个人页中标题渐隐及沉浸式导航栏效果。
pingan8787
2019/10/23
1K0
【小程序】384- 如何一人五天开发完复杂小程序(前端必看)
小程序长列表优化实践
在一些电商的小程序项目中,长列表是一个很普遍的场景,在加载大量的列表数据的过程中,可能会遇到手机卡顿,白屏等问题。也许数据进行分页处理可以防止一次性加载数据带来的性能影响,但是随着数据量越来越大,还是会让小程序应用越来越卡顿,响应速度越来越慢。这种问题不仅仅在小程序上,在移动端 h5 项目中同样存在。
用户6835371
2022/09/01
2.8K0
小程序长列表优化实践
京喜小程序的高性能打造之路
京喜小程序自去年双十一上线微信购物一级入口后,时刻迎接着亿级用户量的挑战,细微的体验细节都有可能被无限放大,为此,“极致的页面性能”、“友好的产品体验” 和 “稳定的系统服务” 成为了我们开发团队的最基本执行原则。
用户6835371
2021/06/01
8710
京喜小程序的高性能打造之路
小程序开发中的一些实践和踩坑
在公司小程序也开发了一段时间了,中间遇到过很多问题,特此记录几个比较典型的问题和解决方案。
张张
2019/12/23
1.2K0
小程序开发中的一些实践和踩坑
微信小程序避坑指南
 详见官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/client-lib/client.html
smy
2018/11/28
3.5K0
微信小程序避坑指南
Taro 小程序开发大型实战(二):多页面跳转和 Taro UI 组件库
在上一篇教程[1]中,我们用熟悉的 React 和 Hooks 搞定了“奥特曼俱乐部”的雏形。在这一篇文章中,我们将用 Taro 自带的路由功能实现多页面跳转,并用 Taro UI 组件库升级之前略显简陋的界面。这一篇完成后的 DEMO 如下:
一只图雀
2020/04/07
3.3K0
「小程序JAVA实战」小程序的表单组件(25)
PS:小程序视图基本就是这样,最后我在myform做了个简单的例子。虽然做了几个例子,但是说实话还是没官网详细。大家一定要记住:学习小程序最好的方式就是通过官网,我也是通过这样学习的。
IT架构圈
2018/12/26
1.7K0
微信小程序(逻辑层的全部知识点)保姆级讲解
小程序开发框架的逻辑层使用 JavaScript 引擎为小程序提供开发者 JavaScript 代码的运行环境以及微信小程序的特有功能。
淼学派对
2022/11/20
1.4K0
微信小程序(逻辑层的全部知识点)保姆级讲解
基于微信小程序云开发(校园许愿墙app)妄想替代学校的表白墙
随着移动端的不断发展,人们大部分的办公及生活应用都开始趋向于移动端。然而在2017年“微信之父”张小龙带领团队,开发了一款叫做微信小程序的东西,它的出现打破了人们认识移动端的隔膜,由以前的需要先下载app然后在开始工作的老式模式,逐渐的趋向于小程序app(无需下载)的形式。
淼学派对
2022/11/20
1.8K0
基于微信小程序云开发(校园许愿墙app)妄想替代学校的表白墙
小程序多平台同构方案分析-kbone 与 remax
此文介绍国内主流小程序的架构,以及通过运行时适配可达到一套小程序代码运行在多个小程序平台上的方案,主要介绍 kbone 与 remax 两套方案,他们原理基本一致,所有小程序代码都在 worker 线程上运行,最终在 worker 线程生成一棵 dom tree,再把 dom tree 同步到 render 线程上通过 w/axml 进行渲染。
binnie
2019/12/17
2.2K0
小程序多平台同构方案分析-kbone 与 remax
微信小程序-零基础入门手册
wx.showLoading(Object object) | 微信开放文档 (qq.com)
打不着的大喇叭
2024/03/11
4540
微信小程序-零基础入门手册
【随手记】微信小程序入坑指南
本篇文章记录了学习微信小程序时遇到的一些问题和知识点,学习材料是coderwhy老师的视频。
客怎眠qvq
2023/03/16
1.1K0
小程序页面事件与wxs脚本
在使用 组件跳转到指定的 tabBar 页面时,需要指定 url 属性和 open-type 属性,其中:
timerring
2023/06/10
6290
小程序页面事件与wxs脚本
【愚公系列】2022年10月 微信小程序-优购电商项目-小程序常见组件
mode 有效值: mode 有 13 种模式,其中 4 种是缩放模式,9种是裁剪模式。
愚公搬代码
2022/11/07
1.1K0
用小程序·云开发轻松构建二手书商城小程序丨实战
使用组件开发效率会高很多,避免重复工作,同时可以参考部分组件的写法,还是有很多值得学习的地方的。
腾讯云开发TCB
2019/09/29
1.9K0
推荐阅读
相关推荐
☀️苏州程序大白一文教你学会微信小程序开发☀️《❤️记得收藏❤️》
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验