【java数据结构与算法】直接戳中"希尔排序"要点,学不会你打我~
希尔排序:
也叫增量递减排序
是插入排序的优化,分组+排序
Get到重点,那么我们开剖析一下

结合图表和代码,总结如下~
public class ShellSort {
public static void main(String[] args) {
int[] arr = new int[]{15,8,20,5,3,1};
//增量递减,所以我们要先确定增量的最大值
int h = 1;
while (h<arr.length){
h=2*h+1;
}
//确定增量的最大值后,
// 我们就可以根据递减规则确定每轮的比较方法
while (h>=1){
/*
因为希尔排序的本质是,插入排序的优化
所以要明确每一轮待进行插入排序的那个元素
以及插入的数组的元素个数的变化规律
*/
for (int i=h;i<arr.length;i++){
/*
难点:
就是最内层循环的理解
一旦进入到循环内,h的值就是固定的
h为最大值得时候,比较特殊,需要比较的元素每组只有2个元素
我们不要纠结每轮根据h的分组数。
因为逻辑关系里面不会对分组数进行量化
随着h的递减,分组减小,每组的元素增加
这个时候根据h确定分组后,元素之间的关系就可以引入插入排序的逻辑
只要进入内层循环后i的值就固定下来了,
我们待排序的元素就固定了
内层循环控制的逻辑
我们要找到剩余元素与i进行比较和交换的结果
再次强调【内层循环变量与i的逻辑关系
其实就是 插入排序的逻辑】
*/
for (int j=i;j>=h;j-=h){
if (arr[j-h]>arr[j]){
int temp = arr[j-h];
arr[j-h] = arr[j];
arr[j] = temp;
}else {
break;
}
}
}
//增量的递减规则
h=h/2;
}
System.out.println(Arrays.toString(arr));
}
}
【java数据结构与算法】直接戳中"希尔排序"要点,学不会你打我~的更多相关文章
- Java数据结构和算法(九)——高级排序
春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...
- Java数据结构和算法之数组与简单排序
一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信 ...
- Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析
前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次.商城商品销量排名.新闻的搜索热度排名等等.也正因为排序的应用范围如此之广,引起了许多人深入研究它的兴趣,直至今天, ...
- 《Java数据结构与算法》笔记-CH3简单排序
class ArrayBub { private long[] arr; private int nElement; public ArrayBub(int size) { arr = new lon ...
- 《java数据结构与算法》系列之“简单排序"-冒泡,选择,插入
好几天又没写,因为这几天很闲,平时忙的时候自己再累都不会睡着,但是呢这没事了,照理说应该是不瞌睡了,结果还睡着了. 所以说,人很贱.也验证了一句话,没有目标的人其实最无聊.人一定要有自己的工作,这工作 ...
- Java数据结构和算法(五)--希尔排序和快速排序
在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...
- Java数据结构和算法 - 高级排序
希尔排序 Q: 什么是希尔排序? A: 希尔排序因计算机科学家Donald L.Shell而得名,他在1959年发现了希尔排序算法. A: 希尔排序基于插入排序,但是增加了一个新的特性,大大地提高了插 ...
- Java数据结构和算法(三)--三大排序--冒泡、选择、插入排序
三大排序在我们刚开始学习编程的时候就接触过,也是刚开始工作笔试会遇到的,后续也会学习希尔.快速排序,这里顺便复习一下 冒泡排序: 步骤: 1.从首位开始,比较首位和右边的索引 2.如果当前位置比右边的 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- Java数据结构和算法(一)——简介
本系列博客我们将学习数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子. 编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱.一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数 ...
随机推荐
- C++ 练习7 引用作为函数返回值
当引用作为函数的返回值时,可以直接将其当作赋值语句的左值使用 如:函数refValue(int& x)可以像 a=10 中的"a"来使用 1 #include <io ...
- JZOJ 1121. Fix
解析 考场时想多了,其实根本不用分阶段 一维状压 \(DP\) 就行了 可我没想清楚,加了个第几次去稳固一个点的阶段 然后时间就炸了!!! \(Code\) #include<cstdio> ...
- CF873E - Awards For Contestants
题意:对于 \(n\) 个人,每个人有一个分数,现在要把所有人分成四等,使得: 前三类都有人 前三类中,任意类的人数不大于其他类的人数的两倍 不能有 \(i\) 的分数比 \(j\) 高但是所属的等级 ...
- CF884E - Binary Matrix
题意:对于一个使用十六进制读入的 \(01\) 矩阵,求其中 \(1\) 的连通块个数,空间限制 16MB .\(n\le 2^{12},m\le2^{14}\) 我们认为如何读入是比较基础的内容,不 ...
- PostgreSQL数据库切割和组合字段函数
Postgresql里面内置了很多的实用函数,下面介绍下组合和切割函数一.组合函数1.concata.语法介绍 concat(str "any" [, str "any& ...
- go并发实战(读书笔记1)
go并发实战,第一天 大部分本书第一章节是来介绍go语言基础的,其实如果你不是大师,只是一个才起飞的菜鸟,建议不要跳过喔! 为什么不要跳过?因为每个人对语言的认知是不一样的,看看别人是怎么理解一个新事 ...
- SAP 删除始终使用选定的格式
修改默认格式 se38 SALV_BS_ADMIN_MAINTAIN
- TypeError: unsupported operand type(s) for |=: 'dict' and 'dict'
原因:python3.9 支持对 dict 类型使用 |, 而较老的版本不支持 解决方案 :1. 用更新的 python 2. 把 | 操作替换成 {**d1, **d2} 来源:https://st ...
- accessservice对于难定位的view如何定位
private static int tabcount = -1; private static StringBuilder sb; public static void printPacketInf ...
- Altium Designer Winter 09 — 01 — 快速创建项目
新建项目 新建原理图 导入所需的库 添加元器件和接插件 连接导线 自动标注.修改元件属性 编译前--修改项目属性 编译,查看消息 生成网表.BOM.简易BOM,打印文件