排序算法之---希尔排序(一看你就懂滴)_希尔排序简单易懂-程序员宅基地

技术标签: 算法  算法分享  python  java  编程语言  插入排序  

一、什么叫“希尔排序”

希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。

重点度已经帮你们标黄啦啦,忘了什么叫插入排序咋搞? 没关系,点它直达 排序算法之—插入排序(看完不懂来打我呀呀)

二、算法思想

  • 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 =1( < …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。(百度官方解释,看不懂没关系,往下看你就懂了
  • 实质上是一种分组插入排序
  • 一般的初次取序列的一半为增量,以后每次减半,直到增量为1。(这里说的是一般,因为这个算法的复杂度与增量序列的大小有关)

三、看动图演示

  1. 数组假设如下:
    在这里插入图片描述
  2. 演示:
    在这里插入图片描述
    Gap=1时,因为上面排完,数组部分已经有序,所以接下来的完整数组进行插序时效率很高。
    在这里插入图片描述
  3. 解析说明:
  • 第一次:Gap = 6 / 2= 3(数组长度除以2,这里用Gap来表示增量,取整来处理)
  • 第二次:Gap = 3 /2 = 1(增量为1,相当于一个完整数组进行插入排序,但是此时数组部分有序程度已经很高了,所以插入速度很快)
四、上代码

Java老大哥:

package suanFa;
import java.util.Arrays;
public class Sort {
    
	/**
	 * 公众号:放牛娃学编程
	 * 1.希尔排序(改进的插入排序)
	 * 2.Gap增量,也就是两数组元素索引之间的间隔(白话说就是两个数相隔了多少)
	 * 3.其实就是在插入排序的基础上加入一个外层控制增量
	 * @param arr
	 */
	public static void shellSort(int[] arr)
	{
    
		for(int Gap = arr.length / 2; Gap > 0; Gap /= 2)
		{
    
			System.out.println(Gap);
			for(int j = Gap; j < arr.length; j++)
			{
    
				for(int t = j; t >= Gap; t-=Gap)
				{
    
					if(arr[t] < arr[t-Gap])
					{
    
						int temp = arr[t];
						arr[t] = arr[t-Gap];
						arr[t-Gap] = temp;
					}
					else
					{
    
						break;
					}
				}
			}
		}
	}
	
	public static void main(String[] args) {
    
		// TODO Auto-generated method stub
		int[] arr = {
    9,3,8,0,4,1,7,2,6,76};
		System.out.println("未开始排序前:"+Arrays.toString(arr));
		shellSort(arr);
		System.out.println("排序完成后:"+Arrays.toString(arr));
	}
}

Python新竞老大哥:

#希尔排序
"""
	 公众号:放牛娃学编程
	 1.希尔排序(改进的插入排序)
	 2.gap增量,也就是两数组元素索引之间的间隔(白话说就是两个数相隔了多少)
	 3.其实就是在插入排序的基础上加入一个外层控制增量
 """
def shellSort(c):
    N = len(c)
    gap = N // 2
    while(gap >= 1):
        for p in range(gap,N):
            Tmp=c[p]
            i=p
            while i>=gap and c[i-gap]>Tmp:
                c[i]=c[i-gap]
                i=i-gap
            c[i]=Tmp
        gap = gap // 2
    return c
if __name__ == "__main__":
	c=[1,5,3,11,4,9,6,8,2,13] 
	print(shellSort(c))

如果上面的动态图你还是没看不懂,那我建议你一看看下面这篇文章:
希尔排序–简单易懂图解,
这篇我感觉作者很走心。所以这里推荐给大家看看

五、分享交流

最后有兴趣一起交流的,可以关注我的公众号:这里你能够学到很实用的技巧,不是常用的我不说,公众号回复提取码即可获取以下学习资料啦啦啦啦,喜欢就拿去吧!!

  1. Java web从入门到精通电子书

  2. Python机器学习电子书

  3. Python400集(北京尚学堂)

  4. JavaScript项目案例、经典面试题

  5. Java300集(入门、精通)

  6. Java后端培训机构录集(同事培训内部提供)

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qiukui111/article/details/104271723

智能推荐

前端开发之vue-grid-layout的使用和实例-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏34次。vue-grid-layout的使用、实例、遇到的问题和解决方案_vue-grid-layout

Power Apps-上传附件控件_powerapps点击按钮上传附件-程序员宅基地

文章浏览阅读218次。然后连接一个数据源,就会在下面自动产生一个添加附件的组件。把这个控件复制粘贴到页面里,就可以单独使用来上传了。插入一个“编辑”窗体。_powerapps点击按钮上传附件

C++ 面向对象(Object-Oriented)的特征 & 构造函数& 析构函数_"object(cnofd[\"ofdrender\"])十条"-程序员宅基地

文章浏览阅读264次。(1) Abstraction (抽象)(2) Polymorphism (多态)(3) Inheritance (继承)(4) Encapsulation (封装)_"object(cnofd[\"ofdrender\"])十条"

修改node_modules源码,并保存,使用patch-package打补丁,git提交代码后,所有人可以用到修改后的_修改 node_modules-程序员宅基地

文章浏览阅读133次。删除node_modules,重新npm install看是否成功。在 package.json 文件中的 scripts 中加入。修改你的第三方库的bug等。然后目录会多出一个目录文件。_修改 node_modules

【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure-程序员宅基地

文章浏览阅读883次。【代码】【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure

整理5个优秀的微信小程序开源项目_微信小程序开源模板-程序员宅基地

文章浏览阅读1w次,点赞13次,收藏97次。整理5个优秀的微信小程序开源项目。收集了微信小程序开发过程中会使用到的资料、问题以及第三方组件库。_微信小程序开源模板

随便推点

Centos7最简搭建NFS服务器_centos7 搭建nfs server-程序员宅基地

文章浏览阅读128次。Centos7最简搭建NFS服务器_centos7 搭建nfs server

Springboot整合Mybatis-Plus使用总结(mybatis 坑补充)_mybaitis-plus ruledataobjectattributemapper' and '-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏3次。前言mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。..._mybaitis-plus ruledataobjectattributemapper' and 'com.picc.rule.management.d

EECE 1080C / Programming for ECESummer 2022 Laboratory 4: Global Functions Practice_eece1080c-程序员宅基地

文章浏览阅读325次。EECE 1080C / Programming for ECESummer 2022Laboratory 4: Global Functions PracticePlagiarism will not be tolerated:Topics covered:function creation and call statements (emphasis on global functions)Objective:To practice program development b_eece1080c

洛谷p4777 【模板】扩展中国剩余定理-程序员宅基地

文章浏览阅读53次。被同机房早就1年前就学过的东西我现在才学,wtcl。设要求的数为\(x\)。设当前处理到第\(k\)个同余式,设\(M = LCM ^ {k - 1} _ {i - 1}\) ,前\(k - 1\)个的通解就是\(x + i * M\)。那么其实第\(k\)个来说,其实就是求一个\(y\)使得\(x + y * M ≡ a_k(mod b_k)\)转化一下就是\(y * M ...

android 退出应用没有走ondestory方法,[Android基础论]为何Activity退出之后,系统没有调用onDestroy方法?...-程序员宅基地

文章浏览阅读1.3k次。首先,问题是如何出现的?晚上复查代码,发现一个activity没有调用自己的ondestroy方法我表示非常的费解,于是我检查了下代码。发现再finish代码之后接了如下代码finish();System.exit(0);//这就是罪魁祸首为什么这样写会出现问题System.exit(0);////看一下函数的原型public static void exit (int code)//Added ..._android 手动杀死app,activity不执行ondestroy

SylixOS快问快答_select函数 导致堆栈溢出 sylixos-程序员宅基地

文章浏览阅读894次。Q: SylixOS 版权是什么形式, 是否分为<开发版税>和<运行时版税>.A: SylixOS 是开源并免费的操作系统, 支持 BSD/GPL 协议(GPL 版本暂未确定). 没有任何的运行时版税. 您可以用她来做任何 您喜欢做的项目. 也可以修改 SylixOS 的源代码, 不需要支付任何费用. 当然笔者希望您可以将使用 SylixOS 开发的项目 (不需要开源)或对 SylixOS 源码的修改及时告知笔者.需要指出: SylixOS 本身仅是笔者用来提升自己水平而开发的_select函数 导致堆栈溢出 sylixos

推荐文章

热门文章

相关标签