【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数据结构和算法(一)——简介
本系列博客我们将学习数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子. 编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱.一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数 ...
随机推荐
- 嵌入式Linux—FreeType矢量字体
freetype矢量字体 常用API 1.FT_Init_FreeType函数是FreeType库中的一个函数,其作用是初始化FreeType库,并返回一个指向FT_Library对象的指针.下面是该 ...
- mac os黑苹果安装
前言 习惯了mac敲代码的攻城师很难再去适应windows,那么如何在windows上安装苹果系统呢?用黑苹果. 关于黑苹果的安装,网上的一大堆教程显得过于啰嗦,又是安装Unlocker破解mac限制 ...
- PDO使用返回结果集的方法输出数据库里面的单个值
1 <?php 2 header('content-type:text/html; charset=utf-8'); 3 /* 通过调用驱动程序创建一个PDO实例 */ 4 $dsn = 'my ...
- redis(10)事务和锁机制秒杀
Redis事务定义 Redis 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. Redis 事务的主要作用就是串联多个 ...
- PostGIS之空间索引
1. 概述 PostGIS 是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在 SQL 中运行空间查询 PostGIS官网:About PostGIS | PostGIS ...
- vue中引入字体
前言: 做大屏 项目需要引入字体做个记录一.先看看效果 二.实现1.下载字体文件 分享一个下载开源字体网站: https://www.dafont.com/theme.php2.文件放到项目中 可以 ...
- vue3中对于/deep/和::v-deep的警告信息处理
目前发现两处警告信息: ::v-deep usage as a combinator has been deprecated. Use :deep() instead. the >>> ...
- 初始化控件panel大小和相对父容器居中
/// <summary> /// 初始化界面大小 /// </summary> protected void InitForm() { int winwith = Scree ...
- Matplotlib 绘图线
绘图过程如果我们自定义线的样式,包括线的类型.颜色和大小等. 线的类型 线的类型可以使用 linestyle 参数来定义,简写为 ls. 类型 简写 说明 'solid' (默认) '-' 实线 'd ...
- vue vite 打包开启 gzip 部署 nginx 支持 gzip
vite 打包开启 gzip 安装插件 npm i vite-plugin-compression --save-dev vite.config.js 配置 import { defineConfig ...