Java进阶学习笔记36——算法

什么是算法?

解决某个实际问题的过程和方法。

1)导航;

2)滴滴打车;

3)抖音;

不同的算法,效率高、性能好!

在Java中,代码已经帮我们写好了,但为什么我们还要学习算法呢?

提升编程思维。

有些面试官就是问一些算法题。

算法是程序员的高级之路。

排序算法:

升序排序:由小到大;

降序排序:由大到小;

冒泡排序

选择排序

学习算法的技巧和路径:

1、搞清楚、理解算法的流程;

2、直接去推敲如何写代码;

冒泡排序:

每轮从数组中找出最大值放到数组的后面去。

两个两个地进行比较。

package cn.ensource.d1_algorithm;

import java.util.Arrays;

public class Test1 {
    public static void main(String[] args) {
        // 1. 准备一个数组
        int[] arr = {5, 1, 2, 3};

        // 定义一个循环,控制排几轮
        for (int i = 0; i < arr.length - 1; i++) {
            // i = 0  1 2
            //  定义一个循环控制每轮比较几次
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
//        for (int i = 0; i < arr.length; i++) {
//            System.out.println(arr[i]);
        System.out.println(Arrays.toString(arr));
    }
}

实现冒泡排序的关键步骤分析:

1)确定总共需要做几轮:数组的长度减一;

2)每轮比较的次数:

选择排序:

每轮选择当前位置,开始找出后面的较小值与该位置进行交换;

定位选择较小值。

package cn.ensource.d1_algorithm;

import java.util.Arrays;

public class Test2 {
    public static void main(String[] args) {
        // 1. 准备好一个数组
        int[] arr = {5, 1, 3, 2};

        // 2. 控制选择几轮
        for (int i = 0; i < arr.length - 1; i++) {
            // i = 0 1 2    j = 1 2 3  j = 2 3 j = 3
            //
            // 控制每轮选择几次
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

算法优化:

找到后面较小值的索引,然后只要交换一次。

package cn.ensource.d1_algorithm;

import java.util.Arrays;

public class Test2 {
    public static void main(String[] args) {
        // 1. 准备好一个数组
        int[] arr = {5, 1, 3, 2};

        // 2. 控制选择几轮
        for (int i = 0; i < arr.length - 1; i++) {
            // i = 0 1 2    j = 1 2 3  j = 2 3 j = 3
            //
            // 控制每轮选择几次
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[minIndex] > arr[j]) {
                    minIndex = j;
                }
            }
            // 决定是否交换
            if (minIndex != i) {
                int temp = arr[minIndex];
                arr[minIndex] = arr[i];
                arr[i] = temp;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

基本查找:

顺序查找:

注意:在数据量很大的时候,基本查找这种从前往后挨个找的形式,性能差,效率地下。

二分查找、折半查找:

前提条件:数组中的数据必须是有序的。

核心思想:每次排除一半的数据,查询数据的性能明显提高很多。

package cn.ensource.d1_algorithm;

public class Test3 {
    public static void main(String[] args) {
        // 1. 准备好一个数组
        int[] arr = {7, 23, 79, 81, 103, 127, 131, 147};

        System.out.println("索引值为:" + binarySearch(arr, 81));
        System.out.println("索引值为:" + binarySearch(arr, 150));

    }

    public static int binarySearch(int[] arr, int target) {
        int low = 0;
        int high = arr.length - 1;

        // 2. 定义一个循环控制折半
        while (low <= high) {             // 两个位置重合
            // 3. 每次折半,都算出中间位置处的索引
            int mid = (low + high) / 2;
            if (arr[mid] == target) {
                return mid;
            } else if (arr[mid] < target) {
                // 往右边找,起始位置发生变化
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }
        return -1;
    }
}

我们再看看API文档中是怎么写这个二分法查找算法的。

 >>>是java中的移位运算符,表示无符号右移。

若对char,byte 或者short 进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5 个低位才会用到。这样可防止我们在一个int 数里移动不切实际的位数。若对一个long 值进行处理,最后得到的结果也是long。此时只会用到右侧的6 个低位,防止移动超过long 值里现成的位数。

掌握编程思想;

面试。 

我们再看我当时学Python的时候,学习二分法的方法:

https://changchunhua.blog.csdn.net/article/details/128228704

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

端午佳节到,礼轻情意重,闪侠惠递帮你高效便宜寄快递

马上就是端午佳节了&#xff0c;我们通常会吃粽子&#xff0c;赛龙舟&#xff0c;但是这些礼物我们该怎么快速的送到我们亲朋好友的手中呢&#xff1f;小编这里非常推荐大家使用闪侠惠递来寄快递。不仅能高效便捷的把礼物送到你的手中&#xff0c;而且还能以非常便宜的价格呢&a…

GIS之arcgis系列06:线划图缓冲区分析

缓冲区工具将在输入要素周围指定距离内创建缓冲区面。 缓冲区例程将遍历输入要素的每个折点并创建缓冲区偏移。 通过这些偏移创建输出缓冲区要素 原理&#xff1a; 01.打开文件 02.确定单位&#xff0c;在文件属性里。 03.工具箱-->分析工具-->邻域分析-->缓冲区。 …

Java中常见错误-Java中注解是否可以继承

Java中注解是否可以继承 Inherited基本概念使用场景注意事项 实体类自定义注解测试方法运行结果使用Inherited不使用Inherited 结论 在解决这个问题之前需要先了解一下Inherited Inherited 基本概念 ​ Inherited是Java中的一个元注解&#xff0c;位于java.lang.annotation包…

如何卸载ollama

文章目录 一 概述二 卸载2.1 Windows平台卸载 ollama2.2 Linux 平台卸载 ollama2.3 Docker 平台卸载 ollama 参考链接 一 概述 本文档主要讲述 ollama 如何卸载&#xff0c;适用范围包括 Windows Linux 以及 Docker 等平台的安装方式。 二 卸载 2.1 Windows平台卸载 ollama …

【干货】SaaS增长|提高销售转化率,用这几个方法就对了!

一、什么是销售转化率 1. 定义 销售转化率是指将潜在客户转化为实际购买者的比率。它衡量了销售过程中的效率和效果&#xff0c;对于评估销售团队的表现和制定销售策略非常重要。 2. 计算公式 销售转化率 (实际购买客户数 / 潜在客户数) 100% 实际购买客户数&#xff1a;…

【python深度学习】——tensor内部存储结构|内存优化与as_strided|内存紧凑化contiguous

【python深度学习】——tensor内部存储结构|内存优化与as_strided|内存紧凑化contiguous 1. tensor的元数据&#xff08;metadata&#xff09;和存储区&#xff08;storage&#xff09;1.1 元数据&#xff08;metadata&#xff09;1.2 存储区&#xff08;Storage&#xff09;1.…

excel公式怎么完全复制到另一列?

例如&#xff1a;A1单元格的内容是E1F1&#xff1b;想要复制到B列&#xff0c;内容也是E1F1&#xff0c;而不是F1G1&#xff1b;怎么做呢&#xff1f; 如果公式复制粘贴到其它位置出现偏差&#xff0c;通常有这么两个原因&#xff1a; 一、公式中的相对引用或混合引起 这个情…

操作字符串获取文件后缀名

记录一种操作字符串获取文件类型的操作方式&#xff0c;方便后期的使用。示例&#xff1a; 输入&#xff1a;"D:/code/Test/Test.txt" 输出&#xff1a;".txt" 设计逻辑&#xff1a; 1.通过查找”/“或者”\\“&#xff0c;找到文件名所在位置&#xff…

【并发程序设计】总篇集(八万字)

11_Concurrent_Programing 1.进程概念 在Linux中&#xff0c;进程是操作系统分配资源和调度运行的基本单位。 Linux中的进程有以下用处&#xff1a; 提高CPU利用率&#xff1a;通过进程的并发执行&#xff0c;可以让多个程序同时利用计算机的资源&#xff0c;这样每个用户都…

学习 SSH Key 生成方法

SSH Key 是用于身份验证的一对密钥&#xff0c;包括公钥和私钥。公钥可以放在需要访问的服务器上&#xff0c;私钥则保留在本地。当你使用SSH连接到支持SSH Key认证的服务器时&#xff0c;服务器会用公钥来加密一个随机生成的字符串发送给客户端&#xff0c;客户端用私钥解密并…

(ICLR,2024)HarMA:高效的协同迁移学习与模态对齐遥感技术

文章目录 相关资料摘要引言方法多模态门控适配器目标函数 实验 相关资料 论文&#xff1a;Efficient Remote Sensing with Harmonized Transfer Learning and Modality Alignment 代码&#xff1a;https://github.com/seekerhuang/HarMA 摘要 随着视觉和语言预训练&#xf…

vscode快捷键英文单词对照表

今天想改我的vscode快捷键&#xff0c;unfoldall这条跟我其他的ide都不一样&#xff0c;我得挨个记……但是ctrlshiftp一打开快捷键 点击右侧齿轮进行快捷键录制&#xff0c;但是我这次点左边进去查看了一下unfoldall当前是什么 后来看到了……这些oem_5是什么鬼&#xff1f; {…

03-07Java自动化之JAVA基础之循环

JAVA基础之循环 一、for循环 1.1for循环的含义 for&#xff08;初始化语句;条件判断;条件控制或–&#xff09;{ ​ //代码语句 } 1、首先执行初始话语句&#xff0c;给变量一个起始的值 2、条件判断进行判断&#xff0c;为true&#xff0c;执行循环体中的代码语句 ​ …

从零开始学习Linux(9)----文件系统

1.前言 1.铺垫 a.文件内容属性 b.访问文件之前&#xff0c;都得先打开&#xff0c;修改文件&#xff0c;都是通过执行代码的方式完成修改&#xff0c;文件必须被加载到内存中 c.谁打开文件&#xff1f;进程在打开文件 d.一个进程可以打开多少个文件呢&#xff1f;可以打开多个…

idea springboot woff/woff2/eot/ttf/svg等小图标不显示的问题 - 第515篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

swiftUI使用VideoPlayer和AVPlayer播放视频

使用VideoPlayer包播放视频&#xff1a;https://github.com/wxxsw/VideoPlayer 提供一些可供测试的视频链接&#xff0c;不保证稳定可用哦&#xff1a; https://vfx.mtime.cn/Video/2019/06/15/mp4/190615103827358781.mp4https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp…

基于ssh的实验室设备管理系统java项目实验室管理系统spring项目jsp项目

文章目录 实验室设备管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 实验室设备管理系统 一、项目演示 实验室设备管理系统 二、项目介绍 基于sshjsp的实验室设备管理系统 系统角色…

6-Django项目--分页模块化封装参数共存

目录 utils/page_data.py 分页模块化封装 在app当中创建一个python package 在当前包里面创建py文件 参数共存 完整代码 utils/page_data.py --包里创建py文件. # -*- coding:utf-8 -*- from django.utils.safestring import mark_safe from copy import deepcopyclass…

网线水晶头为什么要按标准线序打

网线接水晶头为什么要按照线序接&#xff1f; 减少串扰和增强信号质量&#xff1a; 双绞线的设计是为了减少信号间的串扰&#xff08; Crosstalk&#xff09;&#xff0c;每一对线芯在传输过程中通过相互扭绞抵消外部电磁干扰。按照标准线序接线能够确保每一对线芯之间的信号传…

maridb10.4.30数据库数据迁移

1.新建数据存储文件夹&#xff0c;例如E:\maridb_data 2.修改原数据所在目录的my.ini文件&#xff0c;例如D:\Program Files\MariaDB 10.4\data\my.ini 3.剪切除my.ini文件外的其他所有文件到迁移目的地文件(E:\maridb_data) 结果如下&#xff1a; 原数据文件目录&#xff1a…