当前位置: 首页 > news >正文

几种常见的算法

一、冒泡排序法

冒泡排序法

  原始数据:3 2 7 6 8

  第1次循环:(最大的跑到最右边)

  2 3 7 6 8(3和2比较,2<3 所以2和3交换位置)

  2 3 7 6 8(3和7比较,3<7 所以不需要交换位置)

  2 3 6 7 8(6和7比较,6<7 所以6和7交换位置)

  2 3 6 7 8(7和8比较,7<8 所以不需要交换位置)

  经过第1次循环,此时剩下参与比较的数据:2 3 6 7

  第2次循环:

  2 3 6 7(2和3比较,2<3,所以不需要交换位置)

  2 3 6 7(3和6比较,3<6,所以不需要交换位置)

  2 3 6 7  (6和7比较,6<7,所以不需要交换位置)

  经过第2次循环,此时剩下参与比较的数据是:2 3 6

  第3次循环:

  2 3 6(2和3比较,2<3,所以不需要交换位置)

  2 3 6(3和6比较,3<6,所以不需要交换位置)

  经过第3次循环,此时剩下参与比较的数据是:2 3

  第4次循环

   2 3(2和3比较,2<3,所以不需要交换位置)

  

  public class BubbleSort{

     public static void main(String[] args){

       //这是int类型的数组对象

       int[] arr = {3,2,6,7,8};

       //经过冒泡排序算法对以上数组中元素进行排序

       //冒泡排序算法的核心是什么?

      

       //7条数据,循环6次。以下的代码可以循环6次(冒泡排序法采用外层循环)

       int count = 0;

       for(int i=arr.length-1;i>0;i--){

          //不管是否需要交换,总之是要比较一次的

          count++;

         //9 8 10  7 6 0 11

         for(int j=0;j<i;j++){

           if(arr[i]>arr[j+1]){

              //交换位置

             //arr[j]和arr[j+1]交换

            int temp;

            temp = arr[j];

            arr[j] = arr[j+1];

            arr[j+1] = temp;

           }

         }

        }

        System.out.println("比较次数:”+count);

       //输出结果

       for(int i=0;i<arr.length;i++){

           System.out.println(arr[i]);

       }

      }

 }

二、选择排序法

 

选择排序法比冒泡排序法的效率高

 高在交换位置上

 选择排序的交换位置是有意义的

 每一次从这“堆”参与比较的数据当中“找出最小值”

拿这个最小值和“参与比较的这堆最前面的元素”交换位置

 循环一次,然后找出参加比较的这堆数据中最小的。拿这个最小的值和

最前面的数据交换位置。

参与比较的数据:3 1 6 2 5

第1次循环之后的结果是: 1 3 6 2 5

下次参与比较的数据:3 6 2 5

第2次循环之后的结果是:2 6 3 5

下次参与比较的数据是:6 3 5

第3次循环之后的结果是:3 6 5

 下次参与比较的数据是: 6 5

第4次循环之后的结果是: 5 6

注意:5条数据,循环4次

冒泡排序和选择排序实际上比较的次数没变

交换位置的次数减少了

3 2 6 1 5

  假设:

     第1个3是最小的

     3和2比较,发现2更小,所以此时最小的是2

     继续拿着2往下比对,2和6比较,2仍然是最小的

     继续拿着2往下比对,2和1比对,发现1更小,所以此时最小的是1

     继续拿着1往下比对,1和5比对,发现1还是小的,所以1就是最小的

     拿着1和最左边的3交换位置

 

  2 6 3 5

   假设:

      第1个2是最小的

      ……

  

  6 3 5

  假设6是最小的,6和3比对,发现3更小,所以此时最小的是3

  ……

 public class SelectSort{

    public static void main(String[] args){

         int[] arr = {3,1,6,2,5};

         int count = 0;

         //选择排序

      //5个数据循环4次(外层循环4次)

     for(int i=0;i<arr.length-1;i++){

       //i的值是0 1 2 3

      //i正好是“参加比较的这堆数据中”最左边那个元素的下标

     //i是一个参与比较的这堆数据中的起点下标

    //假设起点i下标位置上的元素是最小的

         int min = I;

         for(int j=i+1;j<arr.length;j++){

          count++;

           if(arr[j]<arr[min]){

              min = j;   //最小值的元素下标是j 

         }

   }

  //当i和min相等时,表示最初猜测是对的

 //当i和min不相等时,表示最初猜测是错的,有比这个元素更小的元素

//需要拿着这个更小的元素和最左边的元素交换位置

 if(min!=i){

   //表示存在更小的数据

  //arr[min]最小的数据

 //arr[i]最前面的数据

    int temp;

    temp = arr[min];

    arr[min = arr[i];

    arr[i] = temp;

    }

  }

  System.out.println("比较次数"+count);

  //排序之后遍历

  for(int i=0;i<arr.length;i++){

      System.out.println(arr[i]);

   }

 }

}

三、二分法查找

 数组的元素查找

   数组元素查找两种方式:

      第一种方式:一个一个挨着找,直到找到为止

      第二种方式:二分法查找(算法),这个效率较高

 public class ArraySearch{

   public static void main(String[] args){

      //这个例子演示第一种方式

      int[] arr = {4,5,6,87,8};

     //需求:找出87的下标。一个一个挨着找

     for(int i=0;i<arr.length;i++){

       if(arr[i]==87){

          System.out.println("87元素的下标是:"+i);

          return;

       }

     }

    //程序执行到此处,表示没有87

   System.out.println("87不存在该元素!");

  

  //最好以上的程序封装到一个方法,思考:传什么参数?返回什么值?

 //传什么:第一个参数是数组,第二个参数是被查找的元素

 //返回值:返回被查找的这个元素的下标,如果找不到返回-1

 int index = arraySearch(arr,87);

 System.out.println(index == -1?"该元素不存在1":"该元素下标是:"+index):

  }

  //从数组中检索某个元素的下标(返回的是第一个元素的下标)

 //arr 被检索的数组

//ele 被检索的元素

//大于等于0的数表示元素的下标,-1表示该元素不存在

  public static void arraySearch(int[] arr,int ele){

      for(int i=0;i<arr.length;i++){

          if(ele == arr[i]){

              return I;

          }

       }

   return -1;

  }

}

关于查找算法中的:二分法查找

10(下标0)11 12 13 14 15 16 17 18 19 20(下标10) arr数组

通过二分法查找,找出18这个元素的下标:

 (0+10)/2-->中间元素的下标:5

拿着中间这个元素和目标要查找的元素进行对比:

  中间元素是:arr[5]-->15

  15<18(被查找的元素)

  被查找的元素18在目前中间元素15的右边

再重新计算一个中间元素的下标:

  开始下标是:5+1

  结束下标是:10

  (6+10)/2-->8

 8下标对应的元素arr[8]是18

   找到的中间元素正好和被查找的元素18相等,表示找到了:下标为8

 二分法查找的终止条件:一直折半,直到中间的那个元素恰好是被查找的元素

 

二分法查找算法是基于排序的基础之上。(没有排序的数据是无法查找的)

 publc class ArrayUtil{

   public static void main(String[] args){

      int[] arr = {100,200,230,235,600,1000,2000,9999);

      //找出arr这个数据中200所在的下标

     //调用方法

     int index = binarySearch(arr,200);

     System.out.println(index==-1?"该元素不存在!":"该元素下标”+index);

    }

   // dest 目标元素

  //-1表示该元素不存在,其他表示返回该元素的下标

   public static void binarySearch(int[] arr,int dest){

     //开始下标

     int begin = 0;

    //结束下标

     int end = arr.length-1;

    

     //开始元素的下标只要在结束元素下标的左边,就有机会继续循环

     while(begin<=end){

     //中间元素下标

     int mid = (begin+end)/2;

     if(arr[mid]==dest){

       return mid;

     }else if(arr[mid]<dest){

       //目标在“中间”的右边

      //开始元素下标需要发生变化(开始元素的下标需要重新赋值)

      begin = mid +1;  //一直加

     }else{

      //arr[mid]>dest

      //目标在“中间”的左边

     //修改结束元素的下标

       end = mid -1;  //一直减

     }

    }

   return -1;

 }

二分法查找原理

  10(下标是0) 23 56 89 100 111 222 235 500 600(下标9)arr数组

 目标:找出600的下标

 (0+9)/2-->4(中间元素的下标)

 arr[4]这个元素就是中间元素:arr[4]是100

 100<600

  说明被查找的元素在100的右边

  那么此时开始下标变成:4+1

 

 (5+9)/2-->7(中间元素的下标)

   arr[7]对应的值是:235

   235<600

   说明被查找的元素在235的右边

  

   开始下标有进行了转变:7+1

   (8+9)/2-->8

     arr[8]-->500

     500<600

     开始元素的下标又发生了变化:8+1

     (9+9)/2-->9

     arr[9]是600,正好和600相等,此时找到了

相关文章:

几种常见的算法

一、冒泡排序法 冒泡排序法 原始数据&#xff1a;3 2 7 6 8 第1次循环&#xff1a;&#xff08;最大的跑到最右边&#xff09; 2 3 7 6 8&#xff08;3和2比较&#xff0c;2<3 所以2和3交换位置&#xff09; 2 3 7 6 8&#xff08;3和7比较&#xff0c;3<7 所以不需要交…...

原生的cURL函数而不是 tp6框架的Http类,curl_init()、curl_setopt()和curl_exec()等cURL函数

GET请求示例&#xff1a; // 初始化 cURL $ch curl_init(); // 设置 cURL 选项 curl_setopt($ch, CURLOPT_URL, https://example.com/api/resource); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 执行 cURL 并获取返回结果 $response curl_exec($ch); // 关闭 cURL…...

Win10下在Qt项目中配置SQlite3环境

资源下载 官网资源&#xff1a;SQLite Download Page 1、sqlite.h sqlite-amalgamation-3450000.zip (2.60 MiB) 2、sqlite3.def&#xff0c;sqlite3.dll sqlite-dll-win-x64-3450000.zip (1.25 MiB) 3、 win10下安装sqlite3所需要文件 sqlite-tools-win-x64-3450000.zipht…...

Sentinel 轨道数据及下载

Sentinel卫星轨道文件在处理Sentinel卫星数据时发挥着关键作用。这些轨道文件包含了有关卫星在轨道上的运动、位置、姿态等信息&#xff0c;对于地理校正、成像几何校正以及多时相分析等方面具有重要作用。以下是Sentinel卫星轨道文件的主要作用&#xff1a; 地理校正&#xff…...

MD5 加密

任务&#xff1a; 接到一个任务&#xff0c;调用对方的接口&#xff0c;内容和密码&#xff0c;需要使用md5进行加密&#xff0c;再发送请求。 参数说明&#xff1a; 参数名称 说明 备注 timespan 时间戳 格式为yyyyMMddHHmmss pwd 密码 此处用原始密码时间戳做MD5加…...

在 Excel 中将列数据用单引号括起来并添加分隔符的解决方案

在 Excel 中&#xff0c;有时候我们需要将某一列的所有值连接在一起&#xff0c;并且每个值用单引号括起来&#xff0c;同时在每个值之间添加逗号和空格。这样的需求在数据处理和导出时比较常见。本文将介绍一种使用 Excel 函数解决这个问题的方法。 解决方案&#xff1a; 方…...

技术硬实力,阿里巴巴为什么要开源Spring Cloud Alibaba?

Spring Cloud Alibaba是阿里巴巴开源的一款高性能的微服务RPC框架&#xff0c;关于Spring Cloud Alibaba的详细介绍我这里就不啰嗦了&#xff0c;大家可以参考官网及相关源码&#xff0c;我这里只是想聊的是“阿里巴巴为什么要开源Spring Cloud Alibaba”&#xff0c;只要追根朔…...

2024 前端高频面试题之 HTML/CSS 篇

【前言】随着市场的逐渐恶劣&#xff0c;通过总结面试题的方式来帮助更多的coder&#xff0c;也是记录自己的学习过程&#xff0c;温故而知新。欢迎各位同胞大大点评补充~ 前端面试题之 HTML/CSS 篇 1、HTML 语义化&#xff1f;2、块级元素&内联样式3、盒子模型的理解&…...

实现将信息作为txt,pdf,图片的形式保存到电脑~

PrintableUtils作为输出信息的工具类&#xff1a; package org.example; import com.itextpdf.text.*; import com.itextpdf.text.Font; import com.itextpdf.text.pdf.PdfWriter; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; im…...

服务器变矿机,该如何应对?

开始 恶意的挖矿程序会导致服务器cpu的异常占用&#xff0c;很让人讨厌。起初&#xff0c;我只是使用top命令显示出占用cpu不正常的进程&#xff0c;发现其中一个进程占用了百分之九十九点几&#xff0c;然后通过kill -9 <PID>命令干掉它。但总是过不了几天&#xff0c;…...

2018年认证杯SPSSPRO杯数学建模A题(第一阶段)海豚与沙丁鱼全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 探究海豚猎捕时沙丁鱼群的躲避运动模型 A题 海豚与沙丁鱼 原题再现&#xff1a; 沙丁鱼以聚成大群的方式来对抗海豚的捕食。由于水下光线很暗&#xff0c;所以在距离较远时&#xff0c;海豚只能使用回声定位方法来判断鱼群的整体位置&#xf…...

【Webpack】预处理器 - 常用loader介绍

选用合适的loader来处理不同的资源和不同的功能&#xff0c;以下是一些主流的loader&#xff0c;但这并不是全部&#xff0c;因为每时每刻都可能有新的loader 发布到 npm上 babel-loader babe-loader 用来处理ES6并将其编译为ESS&#xff0c;它使我们能够在最新的工程中使用最…...

lodash 的 _.groupBy 函数是怎么实现的?

说在前面 &#x1f388;lodash的_.groupBy函数可以将一个数组按照给定的函数分组&#xff0c;返回一个新对象。该函数接收两个参数&#xff1a;第一个参数是要进行分组的数组&#xff0c;第二个参数是用于分组的函数。该函数会对数组中的每个元素进行处理&#xff0c;返回一个值…...

(2024,ViM,双向 SSM 骨干,序列建模)利用双向状态空间模型进行高效视觉表示学习

Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0.摘要 3. 方法 3.1. 基础知识 3.…...

docker容器和常用命令

1.什么是容器 容器是隔离的环境中运行的一个 进程 , 如果进程结束 , 容器就会停止. 细致: 容器的隔离环境 , 拥有自己的 ip 地址 , 系统文件 , 主机名 , 进程管理 , 相当于一个 mini的系统 2.容器 vs 虚拟机 3.Docker极速上手指南 #1.安装相关依赖. sudo yum install -y …...

【征服redis9】快速征服lua脚本

lua脚本&#xff0c;这个名字总让人想歪&#xff0c;不过老外发明名字&#xff0c;我们只能跟着叫了。这个脚本语言在redis里和Nginx里都有用&#xff0c;所以我们就来看一下。 目录 1 lua的介绍与说明 2 lua的基本语句体验 3.Lua的数据结构和高级特性 1 lua的介绍与说明 …...

vue3.2二次封装antd vue 中的Table组件,原有参数属性不变

vue3.2中的<script setup>语法 在项目中多处使用到表格组件,所以进行了一个基础的封装,主要是通过antd vue 中表格的slots配置项,通过配合插槽来进行封装自定义表格; 这次主要的一个功能是编辑之后变成input框 修改了之后变成完成发送请求重新渲染表格&#xff1a; 子…...

GBASE南大通用分享,如何修改可信上下文

在以下示例中&#xff0c;假设该可信上下文对象 appserver 存在并启用。以下的 ALTER TRUSTED CONTEXT 语句将 appserver 可信上下文对象的对象方式重置为 DISABLE。当其处于该方式时&#xff0c; appserver 可信上下文仍然存在&#xff0c;但是它不能用于存取数据库服务器。 …...

冻结Prompt微调LM: T5 PET (a)

T5 paper: 2019.10 Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer Task: Everything Prompt: 前缀式人工prompt Model: Encoder-Decoder Take Away: 加入前缀Prompt&#xff0c;所有NLP任务都可以转化为文本生成任务 T5论文的初衷如…...

119 BFS和DFS解二叉树的所有路径

问题描述&#xff1a;给定一个二叉树&#xff0c;返回所有从根节点到叶子节点的路径。说明&#xff1a;叶子节点是指没有子节点的节点。 DFS求解&#xff1a;定义一个全局的链表&#xff0c;用来装所有的结果&#xff0c;通过DFS遍历&#xff0c;一旦遍历到当前节点没有子节点…...

SpringBoot缓存相关注解的使用

CacheConfig&#xff1a;主要用于配置该类中会用到的一些共用的缓存配置 Cacheable&#xff1a;主要方法的返回值将被加入缓存。在查询时&#xff0c;会先从缓存中获取&#xff0c;若不存在才再发起对数据库的访问 CachePut&#xff1a;主要用于数据新增和修改操作 CacheEvi…...

SpiderFlow爬虫平台漏洞利用分析(CVE-2024-0195)

1. 漏洞介绍 SpiderFlow爬虫平台项目中spider-flow-web\src\main\java\org\spiderflow\controller\FunctionController.java文件的FunctionService.saveFunction函数调用了saveFunction函数&#xff0c;该调用了自定义函数validScript&#xff0c;该函数中用户能够控制 functi…...

计算机网络-甘晴void学习笔记

计算机网络 计科210X 甘晴void 202108010XXX 文章目录 计算机网络期中复习1计算机网络和因特网1.1 因特网1.2 网络边缘1.3 网络核心1.4 分组交换的时延/丢包和吞吐量1.5 协议层次与服务模型 2 应用层原理2.1 应用层协议原理2.2 Web和Http2.3 因特网中的电子邮件2.4 DNS&#x…...

vue中使用echarts实现省市地图绘制,根据数据在地图上显示柱状图信息,增加涟漪特效动画效果

文章目录 一、实现效果二、实现方法1、安装echarts插件2、获取省市json数据3、本例中data 数据4、吉林省地图的绘制5、柱状图样式6、设置柱状底部涟漪特效样式7、数据处理 三、示例代码已上传&#xff0c;去顶部可下载四、效果展示 一、实现效果 使用echarts实现省市地图绘制&…...

Android aar包集成与报错

Android Studio引用AAR的方式&#xff0c;分为gradle7.0之前与7.0之后 一、集成步骤 方法一&#xff1a; 1.将对应的xxx.aar包复制到项目的libs目录下&#xff08;xxx代表需要引入的aar包名称&#xff09; 2.然后在模块的build.gradle文件中配置implementation files(libs/lib…...

CentOS 7.9 安装图解

特特特别的说明 CentOS发行版已经不再适合应用于生产环境&#xff0c;客观条件不得不用的话&#xff0c;优选7.9版本&#xff0c;8.5版本次之&#xff0c;最次6.10版本&#xff08;比如说Oracle 11GR2就建议在6版本上部署&#xff09;&#xff01; 引导和开始安装 选择倒计时结…...

Gitea Webhook报错 webhook.ALLOWED_HOST_LIST setting

Gitea Webhook报错 webhook.ALLOWED_HOST_LIST setting 登录到Gitea中&#xff0c;编辑app.ini vi /data/gitea/conf/app.ini [webhook] ALLOWED_HOST_LIST 你的IP地址示例 [webhook] ALLOWED_HOST_LIST 192.168.3.98...

SQL 最大连续合格次数 最大连胜记录次数 最大连败记录次数

有这样一个问题&#xff0c;工厂中要统计某个供应商送货检验的情况&#xff0c;依照其连续合格次数&#xff0c;决定是否免检&#xff0c;不使用游标或者循环&#xff0c;如何写这个sql。 此情景也可以用于统计连胜记录等 先要学习一下 窗函数LAG&#xff0c;指的是按分组和排…...

着色器语言GLSL学习

1 初步尝试 import { Scene, WebGLRenderer, OrthographicCamera, PlaneGeometry, ShaderMateria } from three.jsconst scene new Scene() const camera new OrthographicCamera(-1,1,1,-1,0.1, 10)const renderer new WebGLRenderer() renderer.setSize(window.innerWidt…...

C#: form 窗体的各种操作

说明&#xff1a;记录 C# form 窗体的各种操作 1. C# form 窗体居中显示 // 获取屏幕的宽度和高度 int screenWidth Screen.PrimaryScreen.Bounds.Width; int screenHeight Screen.PrimaryScreen.Bounds.Height;// 设置窗体的位置 this.StartPosition FormStartPosition.M…...