日撸 Java 三百行day43-44

news2025/1/13 6:31:54

文章目录

  • 说明
  • day43 插入排序
    • 思路
    • 代码
  • day44 希尔排序
    • 思路
    • 代码
  • 对比

说明

闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客
自己也把手敲的代码放在了github上维护:https://github.com/fulisha-ok/sampledata

day43 插入排序

思路

插入排序基本思想:把一个待排序的数据插入到已经排序好的序列中。具体的步骤为:

  • 1.将序列的第一个元素作为已经排序好的,其他元素看作未排序的;
  • 2.遍历未排序的元素,将每一个元素都插入到已排序的序列中合适的位置,保证每一次插入后任然是有序的(直到遍历完所有的序列)

代码

插入排序的代码中第一个位置即data[0]的数据是没有用到的,赋值了一个很小的数据我们可以不用担心数据越界。

    /**
     * insertion sort.
     * data[0] dose not store a valid  data. data[0].key should be smaller than any valid key
     */
    public void insertionSort() {
        DataNode tempNode;
        int j;
        for (int i = 2; i < length; i++) {
            tempNode = data[i];
            for (j = i-1; data[j].key > tempNode.key; j--) {
                data[j+1] = data[j];
            }

            data[j+1] = tempNode;

            System.out.println("Round " + (i - 1));
            System.out.println(this);
        }
    }

    public static void insertionSortTest() {
        int[] tempUnsortedKeys = { -100, 5, 3, 6, 10, 7, 1, 9 };
        String[] tempContents = { "null", "if", "then", "else", "switch", "case", "for", "while" };
        DataArray tempDataArray = new DataArray(tempUnsortedKeys, tempContents);

        System.out.println(tempDataArray);

        tempDataArray.insertionSort();
        System.out.println("Result\r\n" + tempDataArray);
    }

在这里插入图片描述

day44 希尔排序

思路

希尔排序可以将他理解为插入排序的一种改进方法,基本思想是:将待排序的序列分为若干子序列,分别对每个子序列进行插入排序,在整个序列基本有序时,又进行一次整体的排序(这时的步长为1,这不就和我们插入排序一样了,但是这时的待排序数组变得基本有序,速度自然更快)(如下图模拟的希尔排序)
在这里插入图片描述

代码

在希尔排序的四次循环,最外的循环是循环要进行几趟排序,第二个循环是在这一趟排序中,有多少组子序列需要排序,在里面的双层循环就和插入排序一样了,找到合适的位置移动数据,再插入数据。在排序过程中,由于变量太多,所以数组位置的赋值很容易乱,需要理清思路,我在这个过程中就出错了。

 /**
     * shell sort.we do not use sentries here because too many of them are needed
     */
    public void shellSort() {
        DataNode tempNode;
        int[] tempJumpArray = {5, 3, 1};
        int tempJump;
        int p;
        for (int i = 0; i < tempJumpArray.length; i++) {
            tempJump = tempJumpArray[i];
            for (int j = 0; j < tempJump; j++) {
                for (int k = j + tempJump; k < length; k += tempJump) {
                    tempNode = data[k];
                    // find the position to insert. at the same time, move other nodes
                    for (p = k - tempJump; p >= 0; p -= tempJump) {
                        if (data[p].key > tempNode.key) {
                            data[p+tempJump] = data[p];
                        } else {
                            break;
                        }
                    }
                    data[p + tempJump] = tempNode;
                }
            }
            System.out.println("Round " + i);
            System.out.println(this);
        }
    }

    public static void shellSortTest() {
        int[] tempUnsortedKeys = { 5, 3, 6, 10, 7, 1, 9, 12, 8, 4 };
        String[] tempContents = { "if", "then", "else", "switch", "case", "for", "while", "throw", "until", "do" };
        DataArray tempDataArray = new DataArray(tempUnsortedKeys, tempContents);

        System.out.println(tempDataArray);

        tempDataArray.shellSort();
        System.out.println("Result\r\n" + tempDataArray);
    }

在这里插入图片描述

对比

  • 通过代码对比,插入排序:数据插入已经排好的序列,需要找到合适的插入位置,并移动数据,最后再插入数据。而希尔排序代码实现和插入排序实现很相似,插入排序只需要进行一次排序就好,而希尔排序要进行多次插入排序,而每一次排序有多个分组需要分别进行插入排序。
  • 插入排序时间复杂度是O(n^2),在最坏的情况是数据全都逆序,最好的情况就是待排序数据基本有序;所以希尔排序更像是插入排序的改进版本,经过几次分组进行排序后数组也就基本变得有序了。
    希尔排序的时间复杂度没有一个具体的值,因为分组的方式不同对时间复杂度的影响就不一样,若步长为1则就可以退化为插入排序,所以最差的时候时间复杂度可以达到 O(n^2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/501793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

磁盘空间不足怎么办?释放磁盘空间的4种方法

虽然现在硬盘的空间越来越大&#xff0c;但是在这个数据爆炸的时代中&#xff0c;总是会觉得存储空间不够用&#xff0c;一不注意磁盘就满了&#xff0c;那么除了清空回收站、卸载某些程序外&#xff0c;还能怎么释放磁盘空间呢&#xff1f; 方案一&#xff1a;禁用休眠 休眠是…

KD305Y带吸收比极化指数兆欧表

一、概述 KD305Y绝缘电阻测试仪对众多的电力设备如&#xff1a;电缆、电机、发电机、变压器、互感器、高压开关、避雷器等要求做一系列的绝缘性能试验&#xff0c;首先是要做绝缘电阻测试。近年来随着电力事业的飞速发展,大容量设备的使用不断增加&#xff0c;用普通的兆欧表无…

Springboot +Flowable,服务任务ServiceTask执行的三种方式(二)

一.简介 ServiceTask 从名字上看就是服务任务&#xff0c;它的图标是像下面这样&#xff0c;截图如下&#xff1a; ServiceTask 一般由系统自动完成&#xff0c;当流程走到这一步的时候&#xff0c;不会自动停下来&#xff0c;而是会去执行我们提前在 ServiceTask 中配置好的…

ubuntu下用VirtualBox安装Windows虚拟机

1.准备工作 从清华大学信息门户——公共服务及其他——软件资源——公共软件——操作系统——Windows11处下载对应的ios系统安装软件 注意下载后将文件名中的 “ .IOS ” 大写改为 “ .ios ” 小写&#xff0c;否则后续虚拟机无法直接识别 问题提示&#xff1a; 解决iso文件不…

【unity造轮子】2d敌人AI的实现,并自动躲避障碍物

最终效果 插件链接: https://download.csdn.net/download/qq_36303853/87762376 导入AI插件 新建空物体,添加PathFinder组件,用在地图导航 渲染导航路径,绘制出来的蓝色部分则为可行走区域,非蓝色区域是我配置的碰撞器区域,可自行修改,如果不满意可以修改Diameter的…

Aztec Hybrid Rollup:混合zkRollup,而非zkEVM

1. 引言 Aztec zkRollup为混合zkRollup&#xff1a; 支持通用私有计算的加密zkRollup&#xff08;命名为Aztec&#xff09;&#xff1a;构建trustless、可扩展的、去中心化的Layer2 zkRollup&#xff0c;同时支持private smart contract execution。同时支持public state和pr…

云原生介绍

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/130540430 一、云原生的概念 云原生的整体概念思路是三统一&#xff0c;即统一基础平台、统一软件架构、统一开发流程。 基于统一的基础平台、软件架构以及开发流程&#xff0c;数字化转型和云化转型能…

04- 评价指标mAP (目标检测)

要点&#xff1a; Precision (准确率 )&#xff1a;TP/(TPFP)&#xff0c;即模型给出的所有预测结果中命中真实目标的比例。Recall (召回率)&#xff1a;TP/(TPFN)&#xff0c;被找到的正确目标和所有正确目标的比值。 官方文档&#xff1a;https://cocodataset.org/#detectio…

用Python批量生成word文档

楼主有个同事妹子每天都做重复性工作而且加班到很晚。这是楼主出于兴趣帮她写的的批量生成保密协议word文档的脚本&#xff0c;共享给大家使用~1小时的工作&#xff0c;用脚本5秒钟即搞定有木有~ copy到本地存成.py文件即可使用&#xff0c;生成的文件是这样的&#xff1a; #创…

MySQL基础(十一)数据处理之增删改

1. 插入数据 1.1 实际问题 解决方式&#xff1a;使用 INSERT 语句向表中插入数据。 1.2 方式1&#xff1a;VALUES的方式添加 使用这种语法一次只能向表中插入一条数据。 情况1&#xff1a;为表的所有字段按默认顺序插入数据 INSERT INTO 表名 VALUES (value1,value2,....)…

文旅数字人出圈不断,文旅数字人宣传片制作赋能数字文旅新业态

在文旅产业发展中 数字人的应用越来越广泛 文旅借助数字人浪潮 把传统文化与科技相融合 以Z世代年轻群体所喜爱的方式 推动文旅数字化发展 文旅数字人应用场景——数字人文旅宣传片 可以让数字人作为文旅宣传片主角&#xff0c;串联当地代表性的历史文化地标、现代都市场景…

webconsole使用方法(fastapi框架)

webconsole使用方法 项目背景docker实现linux实现 安装webconsole包代码中需要改动的地方引用路由加入路由到访问路径 示例接口访问路径 项目背景 需要在自己的项目中&#xff0c;可以实时连接linux或者docker的命令行&#xff0c;以此来达到webconsole或者叫web terminal的这…

开源智慧家居

与家居行业、服务行业等伙伴协同合作&#xff0c;努力创造社会价值&#xff0c;提升行业整体服务 水平&#xff0c;树立家居服务业统一售后标准&#xff0c;构建品质、高效、有温度的居家生活服务新生态。 为企业商家和个人客户提供家居配送、搬运、安装、维修、保养等服务。 …

在Linux系统中搭建Docker环境

搭建Docker环境 文章目录 搭建Docker环境Ubuntu版本安装DockerCentos版本安装Docker配置镜像加速 Ubuntu版本安装Docker 按照以下步骤在 Ubuntu 上安装 Docker&#xff1a; 卸载旧版本的 Docker&#xff08;如果有&#xff09;&#xff1a; sudo apt-get remove docker docker…

【PYTHON】绘制热力图SEABORN.HEATMAP

目录 一、参数详解二、颜色参数-cmap三、个性化设置四、代码 更多python资料、源码、教程皆可点击文章下方名片获取此处跳转 一、参数详解 seaborn.heatmap&#xff08;&#xff09; seaborn.heatmap(data, vminNone, vmaxNone, cmapNone, centerNone, robustFalse, annotNon…

又一里程碑,alibaba首推Java技术成长笔记,业内评级“钻石级”

前言 根据数据表明&#xff0c;阿里巴巴已经连续3年获评最受欢迎的中国互联网公司&#xff0c;实际上阿里巴巴无论在科技创新力还是社会创造价值这几个方面&#xff0c;都是具有一定代表里的。在行业内&#xff0c;很多互联网企业也将阿里作为自己的标杆&#xff0c;越来越多的…

智慧厕所引导系统的应用

智慧公厕引导系统是一种基于智能化技术的公厕管理系统&#xff0c;可以为如厕者提供更加便捷、舒适、安全的如厕环境和服务&#xff0c;同时也可以引导如厕者文明如厕&#xff0c;营造文明公厕的氛围。智慧公厕引导系统可以通过智能引导屏、手机小程序等方式&#xff0c;为如厕…

Spring Security OAuth2.0(四)-----OAuth2+JWT

传统的通过 session 来记录用户认证信息的方式我们可以理解为这是一种有状态登录&#xff0c;而 JWT 则代表了一种无状态登录。「无状态登录天然的具备单点登录能力」 1. 无状态登录 1.1 什么是有状态 有状态服务&#xff0c;即服务端需要记录每次会话的客户端信息&#xff…

asp.net+sqlserver房屋中介管理信息系统

据信息处理工作量大时容易出错&#xff1b;数据繁多时&#xff0c;容易丢失&#xff0c;且不易查找&#xff0c;出错后又不易修改。 基于以二、系统主要划分为房屋和客户两种角色。主要功能划分为&#xff1a;客户管理&#xff0c;房屋管理和交易管理三大块。其中&#xff1a;…

JVM系列-第5章-堆(JVisualVM)

堆 堆的核心概述 堆与进程 堆针对一个JVM进程来说是唯一的。也就是一个进程只有一个JVM实例&#xff0c;一个JVM实例中就有一个运行时数据区&#xff0c;一个运行时数据区只有一个堆和一个方法区。 但是进程包含多个线程&#xff0c;他们是共享同一堆空间的。 一个JVM实例…