Java基础学习(十一)

news/2025/3/10 12:11:08/文章来源:https://www.cnblogs.com/victoria6013/p/18692034

Java基础学习(十一):常见算法

目录
  • Java基础学习(十一):常见算法
    • 查找算法
    • 排序算法

本文为个人学习记录,内容学习自 黑马程序员


查找算法

  • 七大查找算法:基本查找(顺序查找)、二分查找(折半查找)、插值查找、斐波那契查找、分块查找、数表查找、哈希查找

  • 基本查找

    • 核心:从 0 索引开始挨个往后查找

    • 示例:使用基本查找,在数组中查询某个元素存不存在

      public static boolean basicSearch(int[] arr, int target) {for (int i = 0; i < arr.length; i++) {if (arr[i] == target) {return true;}}return false;
      }
      
  • 二分查找

    • 前提:数组中的数据必须是有序的

    • 核心:每次排除一半的查找范围

    • 示例:使用二分查找,在数组中查询某个元素存不存在

      public static boolean binarySearch(int[] arr, int target) {int min = 0;int max = arr.length - 1;while (true) {if (min > max) {return false;}int mid = (min + max) / 2;if (arr[mid] > target) {max = mid - 1;} else if (arr[mid] < target) {min = mid + 1;} else {return true;}}
      }
      
  • 插值查找

    • 插值查找是对于二分查找的改进,当然,只有在数组中数据分布比较均匀时才有改进效果

    • 核心:计算中间值时不是根据二分,而是通过插值公式

      图片
  • 斐波那契查找

    • 斐波那契查找也是对于二分查找的改进
    • 核心:计算中间值时不是根据二分,而是根据斐波那契数列进行分割
  • 分块查找

    • 分块原则:1. 数组中,前一块中的最大数据应小于后一块中的所有数据 2. 块的数量一般等于数字总个数开根号

    • 核心:先确定要查找的元素在哪一块,然后在块内挨个查找

    • 示例:使用分块查找,在数组中查询某个元素存不存在

      public class Test {public static void main(String[] args) {// 对数组进行分块int[] arr = {16, 5, 9, 12, 21, 18,32, 23, 37, 26, 45, 34,50, 48, 61, 52, 73, 66};Block b1 = new Block(21, 0, 5);Block b2 = new Block(45, 6, 11);Block b3 = new Block(73, 12, 17);Block[] blocks = {b1, b2, b3};int target = 30;boolean result = BlockSearch(blocks, arr, target);System.out.println(result);}// 分块查找public static boolean BlockSearch(Block[] blocks, int[] arr, int target) {int blockIndex = -1;for (int i = 0; i < blocks.length; i++) {if (target <= blocks[i].getMax()) {blockIndex = i;break;}}if (blockIndex == -1) {return false;}int startIndex = blocks[blockIndex].getStartIndex();int endIndex = blocks[blockIndex].getEndIndex();for (int i = startIndex; i <= endIndex; i++) {if (arr[i] == target) {return true;}}return false;}
      }// 块类,存储每一块的最大值、起始索引和结束索引
      class Block {private int max;private int startIndex;private int endIndex;// 省略构造方法和get/set方法
      }
      
    • 扩展的分块查找:考虑到有时会面临无法从小到大分块的情况,扩展后的分块查找只要求各个块的数值区间不发生重合即可


排序算法

  • 十大排序算法:冒泡排序、选择排序、插入排序、快速排序、希尔排序、堆排序、桶排序、归并排序、计数排序、基数排序

  • 冒泡排序

    • 核心:相邻的数据两两比较,小的放前面,大的放后面,每轮排序都会将最大值后置

    • 说明:假如有 4 个数字,第 1 轮时依次比较 1 和 2,2 和 3,3 和 4;第 2 轮时依次比较 1 和 2,2 和 3;第 3 轮时比较 1 和 2

    • 示例:使用冒泡排序对数组从小到大排序

      int[] arr = {2, 4, 5, 3, 1};
      for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}
      }
      
  • 选择排序

    • 核心:从 0 索引开始,拿每一个索引上的元素和后面的元素依次比较,小的放前面,大的放后面,每轮排序都会将最小值前置

    • 说明:假如有 4 个数字,第 1 轮时依次比较 1 和 2,1 和 3,1 和 4;第 2 轮时依次比较 2 和 3,2 和 4;第 3 轮时比较 3 和 4

    • 示例:使用选择排序对数组从小到大排序

      int[] arr = {2, 4, 5, 3, 1};
      for (int i = 0; i < arr.length - 1; i++) {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;}}
      }
      
  • 插入排序

    • 核心:将 0 索引的元素到 N 索引的元素看作是有序的,将 N+1 索引的元素到最后一个元素看作是无序的。遍历无序的数据将之插入到有序序列中的对应位置,如果遇到相同的数据则插在后面

    • 示例:使用插入排序对数组从小到大排序

      int[] arr = {2, 4, 5, 3, 1};
      // 1.计算无序序列的开始索引 startIndex
      int startIndex = -1;
      for (int i = 0; i < arr.length; i++) {if (arr[i] > arr[i + 1]) {startIndex = i + 1;break;}
      }
      // 2.遍历无序序列,插入到有序序列中
      for (int i = startIndex; i < arr.length; i++) {int j = i;while (j > 0 && arr[j] < arr[j - 1]) {int temp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = temp;j--;}
      }
      
  • 快速排序

    • 核心:第一轮排序时,将 0 索引的数作为基准数,确定基准数在数组中正确的位置,比基准数小的全部在左边,比基准数大的全部在右边;第二轮时,根据归位后的基准数将数组分成两个小数组,在这两个小数组中继续进行快速排序

    • 优势:利用递归的思想,效率非常高

    • 示例:使用快速排序对数组从小到大排序

      public static void main(String[] args) {int[] arr = {2, 4, 5, 3, 1};quickSort(arr, 0, arr.length - 1);
      }// 快速排序
      // 参数一:要排序的数组
      // 参数二:排序的起始索引
      // 参数二:排序的结束索引
      public static void quickSort(int[] arr, int i, int j) {// 记录要排序的范围int start = i;int end = j;// 递归结束条件if (start > end) {return;}// 记录基准数int baseNumber = arr[i];while (start != end) {// 必须先移动end再移动start!// 利用end从后往前查找比基准数小的数字while (true) {if (end <= start || arr[end] < baseNumber) {break;}end--;}// 利用start从前往后查找比基准数大的数字while (true) {if (end <= start || arr[start] > baseNumber) {break;}start++;}// 将end和start指向的数字交换int temp = arr[start];arr[start] = arr[end];arr[end] = temp;}// 基准数归位int temp = arr[i];arr[i] = arr[start];arr[start] = temp;// 对归位后基准数左侧的小数组进行快速排序quickSort(arr, i, start - 1);// 对归位后基准数右侧的小数组进行快速排序quickSort(arr, start + 1, j);
      }
      

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[2025.1.26 MySQL学习] 存储引擎

存储引擎 MySQL体系结构图

范围修改查询问题

范围修改查询问题 http://www.nfls.com.cn:10611/up/paper/国家集训队2024论文集.pdf P63 引入 这部分作者定义了半群和幺半群来描述一般的线段树可以做到的结构半群:结合律幺半群:结合律、有幺元交换半群:结合律、交换律形式化问题:(以下是通俗易懂的版本)给定交换半群 …

实现超图S3M数据在Ceisum中的解析、加载

使用超图提供的S3M加载模块。参考文档:S3M_JS使用方法 1. 将项目的Cesium库的Build目录及其内容放在S3M_JS目录中,与S3M_module同级。2. 调用该模块解析、加载S3M数据 const layer = new S3MTilesLayer({context: window.viewer.scene._context,url }) window.viewer.scene.p…

Beyond Compare(文件比较工具) v5.0.5.30614 多语便携版

Beyond Compare是一款功能强大的文件和文件夹比较工具,它能够快速准确地比较文件之间的差异,并提供了一系列强大的功能和工具来帮助用户进行文件和文件夹的同步、合并和备份。 软件功能 - 文件和文件夹比较:Beyond Compare能够快速准确地比较两个文件或文件夹之间的差异,包…

使用EarTrumpet代替windows默认的音量调节功能

前言 https://github.com/File-New-Project/EarTrumpet Windows 默认的音量调节功能挺弱的,要分别调节各个应用的音量得进入二级菜单,麻烦得很 有了这个功能就很方便了 截图安装 老规矩,Github、Microsoft Store、choco、scoop都行 我选的是 scoop 扩展:替换系统的音量控制…

JS-43 document对象_方法/创建元素

document创建元素:createElement(创建元素)createTextNode(创建元素文本)createAttribute(创建元素的属性) 1、document.createElement()document.createElement方法用来生成元素节点,并返回该节点var newDiv=document.createElement(div); 2、document.createTextNode()…

Keydd : 流量包匹配敏感信息的工具

免责声明 工具仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律及连带责任。信息及工具收集于互联网,真实性及安全性自测!!!​ 项目介绍 一直在使用一些工具插件,来检测流量中的ak、sk、sfz、敏感信息,但是网上…

使用twinkle-tray快捷调整多个显示器的亮度

前言 自从安装了这个小工具,我再也没用过笔记本键盘上的快捷键了~ 介绍Twinkle Tray enables brightness control on external displays in Windows 10 & 11. Even though Windows is capable of adjusting the backlight on most monitors, it doesnt support external m…

ACM寒假集训第二次作业

二分查找 思路 运用二分查找,逐渐逼近所要查找的数字 代码 #include<iostream> using namespace std; int binary_search(int arr[],int l,int r,int x){int mid;while(l<r){mid=(l+r)>>1;if(arr[mid]>=x) r=mid;else l=mid+1;}return arr[l]; }; int main(…

【Java安全】保护Java应用程序:如何嗅探JVM的变量

在这篇文章中,我们回顾如何嗅探JVM的变量可能的方法。这篇文章的主要目的是解释如何保护你的应用程序。计划是进行下一步的攻击。从Dump中读取敏感数据。通过在外部依赖中注入恶意软件来窃取源代码。从Java Dump中窃取数据, 如果有人获得了对Java进程的访问权,他可能会读取敏…

第二讲 二分法

第一题 二分查找 输入一个整数 n 和 n 个整数,保证这 n个整数已经按照从小到大进行排序。 然后输入一个整数 q( q≤100000)代表 q次查询。接下来 q 行,每行含有一个整数 m ,代表一次查询。对于每次查询,使用二分查找判断 m 是否在之前输入的 n个整数中出现过。如果出现,…

draw.io(免费流程图制作工具) v26.0.7 中文绿色版

draw.io是一款免费的在线图表绘制工具,它提供了强大的功能和易于使用的界面,适用于各种绘图需求。 软件功能 1. 多种类型的图表:draw.io支持创建各种类型的图表,包括流程图、组织结构图、UML图、网络拓扑图、平面图等。2. 自定义图表元素:用户可以根据自己的需求,自定义…