一、什么叫“希尔排序”
希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。
重点度已经帮你们标黄啦啦,忘了什么叫插入排序咋搞? 没关系,点它直达 排序算法之—插入排序(看完不懂来打我呀呀)
二、算法思想
- 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 =1( < …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。(百度官方解释,看不懂没关系,往下看你就懂了)
- 实质上是一种分组插入排序
- 一般的初次取序列的一半为增量,以后每次减半,直到增量为1。(这里说的是一般,因为这个算法的复杂度与增量序列的大小有关)
三、看动图演示
- 数组假设如下:
- 演示:
Gap=1时,因为上面排完,数组部分已经有序,所以接下来的完整数组进行插序时效率很高。
- 解析说明:
- 第一次: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))
如果上面的动态图你还是没看不懂,那我建议你一看看下面这篇文章:
希尔排序–简单易懂图解,
这篇我感觉作者很走心。所以这里推荐给大家看看
五、分享交流
最后有兴趣一起交流的,可以关注我的公众号:这里你能够学到很实用的技巧,不是常用的我不说,公众号回复提取码即可获取以下学习资料啦啦啦啦,喜欢就拿去吧!!
-
Java web从入门到精通电子书
-
Python机器学习电子书
-
Python400集(北京尚学堂)
-
JavaScript项目案例、经典面试题
-
Java300集(入门、精通)
-
Java后端培训机构录集(同事培训内部提供)