【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数据结构和算法(一)——简介
本系列博客我们将学习数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子. 编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱.一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数 ...
随机推荐
- ASP.NET Core - 依赖注入(二)
.NET Core 依赖注入的基本用法 话接上篇,这一章介绍 .NET Core 框架自带的轻量级 Ioc 容器下服务使用的一些知识点,大家可以先看看上一篇文章 [ASP.NET Core - 依赖注 ...
- Bus Stop
题目 题意: 大概就是在x轴上(一维),有n个房子的坐标,你要建立公交车站,使得每个房子离最近的车站不过10公里,求最少的车站. 思路: 很简单,之接贪心即可,每次判断当前房子的后20公里有没有房子, ...
- Gear_Of_War#1
Gear_Of_War#1 目录 Gear_Of_War#1 1 信息收集 1.1 端口扫描 1.2 后台目录扫描 1.3 SMB服务安全分析 2 GetShell 2.1 ssh登录marcus用户 ...
- Jmeter 常用命令 之 CLI模式
一.Jmeter的非GUI模式命令(即CLI模式command line) 命令: 命令参数 命令释义 -n 设置命令行模式 -t 指定JMX脚本路径参数为:JMX脚本路径,若非当前目录需用全路径或相 ...
- VUE学习-插槽
插槽 匿名插槽 子组件设置匿名插槽 <script type="text/x-template" id="custom-comp"> <div ...
- Python语言课程实验报告
Python语言基础实验 一.实验目的和要求 1.了解Python的基本数据类型: 2.学习了解变量的定义与使用: 3.学会使用Python运算符: 4.掌握数据类型的实际应用. 二.实验环境 软件版 ...
- 图文并茂解释开源许可证 GPL、BSD、MIT、Mozilla、Apache和LGPL的区别?
BSD开源协议BSD开源协议是一个给于使用者很大自由的协议.基本上使用者可以"为所欲为",可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布. 但" ...
- Java面向对象之Object类
Object类 Object类是所有Java类的根父类 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 Object类中的功能(属性.方法)就具有 ...
- idea快捷的输出常用语句
sout:System.out.println(); psvm:public static void main(String[] args) {}
- swagger TypeError: Failed to fetch
最近开发一个项目,项目接口规范是swagger,初次使用swagger遇见很多问题,通过写博记录在项目中遇见的swagger各种情况 我项目中解决方法: 改为: 需要与自己在laravel 框架中e ...