排序算法之---希尔排序(一看你就懂滴)

一、什么叫“希尔排序”

希尔排序(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后端培训机构录集(同事培训内部提供)

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值