【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数据结构和算法(一)——简介
本系列博客我们将学习数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子. 编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱.一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数 ...
随机推荐
- 硬件协议之uart
1. 常规状态下,高电平 2. Start位, 低电平 3. 数据信号次序LSB, 即bit0最先传输, 低电平代表0, 高电平代表1 4. Stop位, 高电平 由此可见传送一个字节,需要1 ...
- 微信小程序wxs封装使用以及公共js组件封装
wxs封装 wxs可以直接写在wxml页面中,并且在对应的位置调用,比如在{{ xxx.xxx() }}调用wxs的函数 <view> <view>第{{m1.getMax(1 ...
- setInterval()的使用
setInterval() 作用 这个函数可以将一个函数每隔一段时间执行一次 参数 1.回调函数,该函数会每隔一段时间被调用一次 2.每次调用间隔的时间,单位是毫秒 返回值 返回一个Numbe ...
- 题解 Trie 但是你要最小化它的节点数量
名字瞎取的 Description 给定 \(n\) 个字符串 \(s\),可以对 \(s_i\) 的字符打乱,将这些字符串加入一个 trie 里面求节点数量最小值. \(n\le 16, \sum ...
- Vue 关键概念介绍
Vue现在已经迭代到 3+ 版本,阅读官方文档的过程中发现作者的一些理念和思路很合我口味,很多概念与方案都是基于解决实际问题提出并实现的,且在权衡利弊后勇于打破常规,比如如何看待关注点分离?.可见,V ...
- Android:Banner 和 Glide 在 Fragment 中实现轮播图
添加依赖信息 引入 Banner 和 Glide 依赖信息: dependencies { implementation 'io.github.youth5201314:banner:2.2.2' i ...
- Python:Excel自动化实践入门篇 乙【送图书活动继续】
*以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/y-npGelPJwmx3iNvHaXRTg 本文上接<Py ...
- LeetCode-1765 地图中的最高点
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/map-of-highest-peak 题目描述 给你一个大小为 m x n 的整数矩阵 isWa ...
- ubuntu 启动脚本变化
ubuntu-16.10 开始不再使用initd管理系统,改用systemd- 快速看了 systemd 的使用方法,发现改动有点大, 包括用 systemctl 命令来替换了 service 和 c ...
- ASP.net EF动态映射实体
1.配置EF与建立实体模型这里不做过多介绍.主要介绍如何动态映射实体模型 1.1.实现过程有很多种方式我们这里使用接口.然后扫描所有继承了该接口的实体类然后映射(也可以自行扩展使用特性) 首先我们新建 ...