惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
Arctic Wolf
M
MIT News - Artificial intelligence
博客园_首页
人人都是产品经理
人人都是产品经理
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Cloudflare Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
Last Week in AI
Last Week in AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
SecWiki News
SecWiki News
Help Net Security
Help Net Security
云风的 BLOG
云风的 BLOG
Blog — PlanetScale
Blog — PlanetScale
H
Heimdal Security Blog
Jina AI
Jina AI
Hacker News: Ask HN
Hacker News: Ask HN
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
博客园 - 【当耐特】
Engineering at Meta
Engineering at Meta
TaoSecurity Blog
TaoSecurity Blog
T
Troy Hunt's Blog
T
Threatpost
AWS News Blog
AWS News Blog
H
Help Net Security
L
LINUX DO - 最新话题
有赞技术团队
有赞技术团队
A
About on SuperTechFans
G
GRAHAM CLULEY
The GitHub Blog
The GitHub Blog
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Recorded Future
Recorded Future
L
Lohrmann on Cybersecurity
Webroot Blog
Webroot Blog
O
OpenAI News
Schneier on Security
Schneier on Security
月光博客
月光博客
P
Privacy International News Feed
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
aimingoo的专栏
aimingoo的专栏
L
LangChain Blog
罗磊的独立博客

Java技术经验分享

生产故障处理SOP分享 | Java技术经验分享 系统稳定性建设实践总结【转载】 | Java技术经验分享 valine访问leancloud国际版异常,评论失效修复 | Java技术经验分享 匆匆忙忙的2021 | Java技术经验分享 聊一下换工作 | Java技术经验分享 IoT系列(2):WIFI设备常见配网方案介绍 | Java技术经验分享 IoT系列(1):什么是物联网 | Java技术经验分享 Java8特性2 - StreamApi | Java技术经验分享 Java8特性1 - lambda表达式&函数式接口 | Java技术经验分享 设计模式(5)-适配器模式 | Java技术经验分享 设计模式(4)-建造者模式 | Java技术经验分享 设计模式(3)-原型模式与浅拷贝和深拷贝 | Java技术经验分享 设计模式(2)-工厂模式图文介绍 | Java技术经验分享 设计模式(1)-带你了解3类8种单例模式 | Java技术经验分享 Java时间处理5---Java8中时区相关类库介绍 | Java技术经验分享 Java时间处理4---Java8中LocalDate、LocalTime、LocalDateTime介绍 | Java技术经验分享 Java时间处理3---Java8中Instant、Duration、Period、Clock介绍 | Java技术经验分享 一些有意思的问答 | Java技术经验分享 Nacos系列博客说明 | Java技术经验分享 菜鸡程序员的2019年度总结 | Java技术经验分享 Java中“附近的人”实现方案讨论及代码实现 | Java技术经验分享 Java时间处理2----时区TimeZone类方法探究(Java8以前) | Java技术经验分享 Java时间处理1----Date和Calendar方法探究(Java8以前) | Java技术经验分享 FastJson中JSONString、JavaBean、JSONObject、JSONArray的转换关系及API示例 | Java技术经验分享 2019.11软考软件设计师归来心得体会及复习备考指南 | Java技术经验分享 你还没用过“约定式提交”吗?那你赶紧来补补知识吧 | Java技术经验分享 教你如何看懂UML中的类图及类图中的关系 | Java技术经验分享 设计模式总览 | Java技术经验分享 萌新入门Github请看这里,学不会远程教 | Java技术经验分享 Hexo的工作原理探究 | Java技术经验分享 Hexo-theme-butterfly修改调整记录教程 | Java技术经验分享 排序8:基数排序 | Java技术经验分享 排序7:归并排序 | Java技术经验分享 排序6:快速排序 | Java技术经验分享 排序5:冒泡排序 | Java技术经验分享 排序4:堆排序 | Java技术经验分享 排序3:选择排序 | Java技术经验分享 排序1:直接插入排序 | Java技术经验分享 推荐一款博客一文多发的良心工具OpenWrite | Java技术经验分享 近期学习计划 | Java技术经验分享 Nacos(九):Nacos集群部署和遇到的问题 | Java技术经验分享 Nacos(八):Nacos持久化 | Java技术经验分享 Nacos(七):Nacos共享配置 | Java技术经验分享 Nacos(六):多环境下如何“管理”及“隔离”配置和服务 | Java技术经验分享 Nacos(五):多环境下如何“读取”Nacos中相应的配置 | Java技术经验分享 Nacos(四):SpringCloud项目中接入Nacos作为配置中心 | Java技术经验分享 Nacos(三):Nacos与OpenFeign的对接使用 | Java技术经验分享 Nacos(二):SpringCloud项目中接入Nacos作为注册中心 | Java技术经验分享 Nacos(一):Nacos介绍 | Java技术经验分享 20190719小组分享 | Java技术经验分享 Java中equals和HashCode方法的分析 | Java技术经验分享 Java中==和equals方法的分析 | Java技术经验分享 Java中的自动拆装箱、装箱缓存 | Java技术经验分享 About-blog | Java技术经验分享 Java中的编译、反编译和反编译工具全家桶分享 | Java技术经验分享 finalize()的生命周期(执行过程) | Java技术经验分享 Java关键字之final、finally与finalize方法 | Java技术经验分享 Java中重写、重载 | Java技术经验分享 Java中面向对象的三大特征:继承、封装、多态 | Java技术经验分享 DockerFile介绍 | Java技术经验分享 Docker环境下安装Gitlab | Java技术经验分享 Docker中私有仓库的搭建流程 | Java技术经验分享 Centos7下两种方式安装Docker-CE | Java技术经验分享 Vert.x创建一个Http服务 | Java技术经验分享 Vert.x创建TCP服务端及客户端 | Java技术经验分享 Vert.x Core(二)- Event Bus(事件总线) | Java技术经验分享 Vert.x-Core(一)- 基础篇 | Java技术经验分享 SpringBoot项目中实现国际化 | Java技术经验分享 Vert.x介绍 | Java技术经验分享 毕设选题项目本地运行环境搭建教程 | Java技术经验分享 Jupyter Notebooks的安装和使用介绍 | Java技术经验分享 算法笔试题:1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题 | Java技术经验分享 Quartz学习总结 | Java技术经验分享 SpringBoot2.x集成Redis | Java技术经验分享 SpringBoot2.x集成MongoDB | Java技术经验分享 [SpringCloud学习] - 浅谈微服务架构 | Java技术经验分享 基于hexo和coding免费搭建个人博客网站 | Java技术经验分享 Hello World | Java技术经验分享
排序2:希尔排序 | Java技术经验分享
文章作者: LarsCheng · 2019-09-06 · via Java技术经验分享

❤查看排序算法动态演示❤查看排序算法动态演示❤查看排序算法动态演示

希尔排序 (Shell Sort)

希尔排序 也称做递减增量排序算法,1959年Shell发明,是插入排序的一种高速而稳定的改进版本

基本思想

希尔排序是先将整个待排序的记录序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,在对全体记录进行依次直接排序

例如上图中的待排序数组:[49,38,65,97,76,13,27,49,55,4]

  1. 将数组按5个间隔为一组划分成5组子序列,每个子序列进行插入排序后,各个子序列就变成了有序的了(整体不一定有序)
  2. 将上一步得到的数组按2个间隔为一组划分成3组子序列,各个子序列进行插入排序
  3. 将上一步得到的数组按正常插入排序,此时序列基本有序,所以效率较高

上面提到的间隔可以称作增量, 一般初始增量取数组的一半长度, 每轮排序后,增量减半,直至增量为1(存在多种增量序列)

算法描述

  1. 选择一个增量序列t1,t2,…,tk,其中t1>t2,tk=1;(一般初次取数组半长,之后每次再减半,直到增量为1)
  2. 按增量序列个数k,对序列进行k 趟排序;
  3. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

如下图,其中H表示增量

希尔排序动图--来源崔显龙

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

import java.util.Arrays;







public class ShellSort {

public static void main(String[] args) {
int[] arr = {49, 38, 65, 97, 76, 13, 27, 49, 55, 4};
System.out.println("排序前:"+Arrays.toString(arr));

int[] a = Arrays.copyOf(arr,arr.length);
shellsort1(a);

int[] b = Arrays.copyOf(arr,arr.length);

shellsort2(arr);


}










private static void shellsort2(int[] arr) {
int gap = 1, i, j, len = arr.length;
int temp;
while (gap < len / 3){

gap = gap * 3 + 1;
}
for (; gap > 0; gap /= 3) {
for (i = gap; i < len; i++) {
temp = arr[i];
for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap){
arr[j + gap] = arr[j];
}
arr[j + gap] = temp;
}
}

System.out.println("排序后:"+Arrays.toString(arr));
}






private static void shellsort1(int[] arr) {

for (int g = arr.length / 2; g > 0; g /= 2) {
for (int i = g; i < arr.length; i++) {

int inserted = arr[i];
int j;

for (j = i - g; j >= 0 && inserted < arr[j]; j -= g) {

arr[j + g] = arr[j];
}
arr[j + g] = inserted;
}
}
System.out.println("排序后:"+Arrays.toString(arr));
}
}

复杂度

希尔排序的复杂度与增量有关,不同的增量会产生不同的复杂度

像我们思路分析中的数组对半取值为增量5,直至为1,其实并不是最优增量序列。

平均时间复杂度 最好情况 最坏情况 空间复杂度
O(n^1.25) O(n) O(n²) O(1)

适用场景

希尔排序时直接插入排序的优化版,解决了直接插入排序在面对大量数据时的效率低问题。

希尔排序适用于大规模无序数组的排序,且相对于直接插入排序数组越大优势越大