常见算法(二分,分块查找,插入,快速排序)

常见算法

1. 顺序查找

package com.mohuanan.exercise;import java.util.ArrayList;public class BasicFind01 {public static void main(String[] args) {int[] arr = {1, 2, 3, 1, 2, 3, 4, 5, 6};int number = 2;ArrayList<Integer> indexList = findIndex(arr, number);if (indexList.size() == 0) {System.out.println("没有该元素");} else {//遍历集合 输出for (int i = 0; i < indexList.size(); i++) {int numberIndex = indexList.get(i);System.out.println(numberIndex);}}}//基本查找public static ArrayList<Integer> findIndex(int[] arr, int number) {//定义一个集合ArrayList<Integer> list = new ArrayList<>();//遍历数组for (int i = 0; i < arr.length; i++) {if (arr[i] == number) {//Java会自动装箱和拆箱list.add(i);}}return list;}
}

2. 二分查找

  • 数组必须是有序的

  • mid只是数组元素的下标,要比较两个数字,是用arr[mid]和number比较,而不是mid和number比较

package com.mohuanan.exercise;public class HalfFind01 {public static void main(String[] args) {//前提是数组是有序的int[] arr = {11, 55, 66, 77, 88, 99};int number = 11;int index = findIndex(arr, number);System.out.println(index);}private static int findIndex(int[] arr, int number) {//两个指针 表示下标int min = 0;int max = arr.length - 1;//二分查找while (min <= max) {int mid = (min + max) / 2;//注意 mid只是 下标//要比较两个值 是arr[mid] 而不是midif(arr[mid]==number){return mid;}else if(arr[mid] > number){max = mid-1;}else if(arr[mid] < number){min = mid + 1;}}//没有找到return -1;}
}

3. 分块查找

  • 块内无序,块间有序
package com.mohuanan.exercise;public class FenkuaiFind01 {public static void main(String[] args) {//分块int[] arr = {11, 5, 8, 9,30, 20,50, 80, 45, 60, 50,84, 90};int number = 20;//创建四个块Block b1 = new Block(11, 0, 3);Block b2 = new Block(30, 4, 5);Block b3 = new Block(80, 6, 10);Block b4 = new Block(90, 11, 12);//创建数组存储每一块Block[] blockArr = {b1, b2, b3, b4};int index = findIndex(blockArr,arr,number);System.out.println(index);}//查找元素public static int findIndex(Block[] blockArr, int[] arr, int number) {//查找该元素在那一块里面int result = findBlock(blockArr, number);if (result == -1) {return -1;} else {//获取该块的开始索引 和最后索引int startIndex = blockArr[result].getStartIndex();int endIndex = blockArr[result].getEndIndex();//从开始索引 到最后索引 遍历arr数字 查找元素for (int i = startIndex; i <= endIndex; i++) {if(arr[i] == number){return i;}}}//没有找到return -1;}private static int findBlock(Block[] blockArr, int number) {//遍历Block数组for (int i = 0; i < blockArr.length; i++) {//如果number小于等于max 那么number就在该块里面if (number <= blockArr[i].getMax()) {return i;}}//该数字太大 不在数组里面return -1;}}class Block {private int max;private int startIndex;private int endIndex;public Block() {}public Block(int max, int startIndex, int endIndex) {this.max = max;this.startIndex = startIndex;this.endIndex = endIndex;}/*** 获取** @return max*/public int getMax() {return max;}/*** 设置** @param max*/public void setMax(int max) {this.max = max;}/*** 获取** @return startIndex*/public int getStartIndex() {return startIndex;}/*** 设置** @param startIndex*/public void setStartIndex(int startIndex) {this.startIndex = startIndex;}/*** 获取** @return endIndex*/public int getEndIndex() {return endIndex;}/*** 设置** @param endIndex*/public void setEndIndex(int endIndex) {this.endIndex = endIndex;}public String toString() {return "Block{max = " + max + ", startIndex = " + startIndex + ", endIndex = " + endIndex + "}";}
}

4. 冒泡排序

package com.mohuanan.sort;public class MaopaoSort {public static void main(String[] args) {int[] arr = {7, 8, 9, 5, 4, 6, 3, 2, 1};int[] sortArr = sortArr(arr);//遍历for (int i : sortArr) {System.out.print(i + " ");}System.out.println();}public static int[] sortArr(int[] arr) {//从da到小//轮数for (int i = 0; i < arr.length - 1; i++) {//内部比较 -1下标 -i后面排好的不用再一次排了for (int j = 0; j < arr.length - 1 - i; j++) {//两个数字 两两比较if (arr[j] < arr[j + 1]) {int t = arr[j];arr[j] = arr[j + 1];arr[j + 1] = t;}}}return arr;}}

5. 选择排序

package com.mohuanan.sort;public class ChooseSort {public static void main(String[] args) {int[] arr = {7, 8, 9, 5, 4, 6, 3, 2, 1};int[] sortArr = sortArr(arr);//遍历for (int i : sortArr) {System.out.print(i + " ");}System.out.println();}private static int[] sortArr(int[] arr) {//da dao xiaofor (int i = 0; i < arr.length - 1; i++) {//注意j必须初始值 是i  i+1也可以表示不用自己和自己比较for (int j = i + 1; j < arr.length; j++) {//原理从0开始 找值 放在开头if (arr[i] < arr[j]) {int t = arr[j];arr[j] = arr[i];arr[i] = t;}}}return arr;}}

6. 插入排序

  • 要重点复习这个算法
package com.mohuanan.sort;public class InsertSort {public static void main(String[] args) {int[] arr = {7, 8, 9, 5, 4, 6, 3, 2, 1};int[] sortArr = sortArr(arr);//遍历for (int i : sortArr) {System.out.print(i + " ");}System.out.println();}private static int[] sortArr(int[] arr) {//找到无序的开始的索引//从大到小int startIndex = -1;for (int i = 0; i < arr.length - 1; i++) {if (arr[i] < arr[i + 1]) {startIndex = i + 1;//找到第一个就退出break;}}System.out.println(startIndex);//从startIndex开始遍历for (int i = startIndex; i < arr.length; i++) {//二分//用于存储i前面数字的索引//j = i; 而不是j= startIndex;int j = i;//arr[j]表示 要插入的元素//arr[j - 1]表示要插入的元素的前面的元素//j> 0 为了下标 到了最后一个数字时 不用在插lwhile (j > 0 && arr[j] > arr[j - 1]) {//交换int t = arr[j];arr[j] = arr[j - 1];arr[j - 1] = t;//往前移一位j--;}}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+ " ");}System.out.println();return arr;}
}

7. 快速排序

  • 重点复习这个算法
package com.mohuanan.sort;public class QuickSort {public static void main(String[] args) {int[] arr = {4, 1, 2, 5, 6, 3, 9, 7, 8, 10};quickSort(arr, 0, arr.length - 1);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}private static void quickSort(int[] arr, int i, int j) {//开始索引int start = i;//结束索引int end = j;//终止递归的条件if (start > end) {return;}//记录基准数int basicNumber = arr[i];//找到基准数//这里要用!=  表示while (start != end) {//先要移动end 从后往前找到 比基准数小的数字while (true) {//这里两个条件//end不能超过stratif (end <= start || arr[end] < basicNumber) {break;}end--;}//再移动start 从前往后找到 比基准数大的数字while (true) {if (start >= end || arr[start] > basicNumber) {break;}start++;}//找到两个数字 交换int t = arr[start];arr[start] = arr[end];arr[end] = t;}//当上面执行完之后//将基准数 和start或者end指向的数字进行交换//拿着这个范围里面的第一个数字进行交换int t = arr[start];arr[start] = arr[i];arr[i] = t;//重复执行quickSort(arr, i, start - 1);quickSort(arr, start + 1, j);}
}

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

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

相关文章

12.事件参数

事件参数 事件参数可以获取event对象和通过事件传递数据 获取event对象 <template><button click"addCount">Add</button><p>Count is: {{ count }}</p> </template> <script> export default {data() {return {count:0…

6.SpringBoot 日志文件

文章目录 1.日志概述2.日志作用3.使用和观察日志3.1如何观察日志3.2使用日志3.3日志级别3.4日志持久化3.5日志分割 4.日志框架4.1门面模式(外观模式)4.2 SLF4J框架介绍4.3 日志格式的说明4.3.1日志名称 5.日志颜色设置6.总结 大家好&#xff0c;我是晓星航。今天为大家带来的是…

Mac下 allure的下载与配置

前提 电脑安装了jdk1.8 链接&#xff1a;mac下配置JDK环境 下载Allure 1.Allure下载最新版本&#xff1a;Releases allure-framework/allure2 GitHub 2.下载后直接解压就好啦 配置 1.根据电脑终端类型输入对应命令&#xff1a; # bash终端 vim ~/.bash_profile # zsh终…

SpringMvc的核心组件和执行流程

一、 springmvc的核心组件及作用 1.DispatcherServlet:前置控制器&#xff0c;是整个流程控制的核心&#xff0c;用来控制其他组件的执行&#xff0c;降低了其他组件的耦合性 2.Handler:控制器&#xff0c;完成具体的业务逻辑&#xff0c;当DispatcherServlet接收到请求后&am…

Pages by User Role for WordPress:强化内容访问控制的必备插件

在数字化时代&#xff0c;WordPress已成为众多网站开发者和设计师的首选平台。然而&#xff0c;如何根据用户角色精确控制内容的访问权限&#xff0c;一直是困扰他们的难题。Pages by User Role for WordPress插件应运而生&#xff0c;为这一难题提供了完美的解决方案。 Pages …

力扣HOT100 - 23. 合并K个升序链表

解题思路&#xff1a; 只要会合并两个升序链表&#xff0c;合并K个做法类似。 class Solution {public ListNode mergeKLists(ListNode[] lists) {ListNode res null;for (int i 0; i < lists.length; i) {res merge(res, lists[i]);}return res;}public ListNode merg…

使用动画做一个走马灯的案例

走马灯 1.第一步-搭建环境 先搭建父盒子。父盒子里面再放入一个子盒子用来装7张图片&#xff0c;有因为图片在一行上了&#xff0c;所以需要使用flex布局。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><me…

LRU算法介绍,LRU算法是什么

左手编程&#xff0c;右手年华。大家好&#xff0c;我是一点&#xff0c;关注我&#xff0c;带你走入编程的世界。 公众号&#xff1a;一点sir&#xff0c;关注领取编程资料 LRU算法简介 LRU&#xff08;Least Recently Used&#xff09;算法是一种常用的缓存替换策略&#xf…

【人工智能基础】知识表示和专家系统

目录 一、知识 知识 产生式表示法 产生式表示形式 确定的事实性知识的产生式表示 不确定的事实性知识的产生式表示 确定的规则知识的产生式表示 不确定的规则知识的产生式表示 产生式系统构成 优点 缺点 语义网络 优点 缺点 框架 框架的一般结构 框架的继承 优…

golang本地缓存库之bigcache

1. 前言 上周工作之余逛github看到一个本地缓存库bigcache&#xff0c;这个是allegro公司开源的一个项目&#xff0c;主要是用于本地缓存使用&#xff0c;根据他们的博客说明&#xff0c;他们编写这个库最初的目的就是实现一个非常快速的缓存服务。 看了下bigcache这个库的源…

【信号与系统 - 10】拉普拉斯变换

1 定义 周期信号的傅里叶变换那篇提到了&#xff1a; F ( j w ) ∫ − ∞ ∞ e − j w t f ( t ) d t F(jw)\int^{\infty}_{-\infty}e^{-jwt}f(t)dt F(jw)∫−∞∞​e−jwtf(t)dt 这个定义式需要满足绝对可积&#xff0c;即 ∫ − ∞ ∞ ∣ f ( t ) ∣ d t < ∞ \int…

ant design vue + jeecgboot 实现本地上传视频及播放视频功能

文章目录 上传视频1. 上传按钮事件2. 上传按钮触发3. 声明变量visible_uploadVideov4. 上传视频弹窗5. 保存视频6. 关闭上传视频弹窗 播放视频1. 获取上传后的视频1.1 插槽2. 触发播放视频事件3. 播放视频弹窗4. 暂停视频 上传视频 1. 上传按钮事件 点击上传按钮事件 --这个地…

linux进阶篇:使用Apache搭建文件服务器目录

Linux服务搭建篇&#xff1a;使用Apache搭建文件服务器目录 一、关于文件服务器 ​ 在一个项目中&#xff0c;如果想把公共软件或者资料共享给项目组成员&#xff0c;可以搭建一个简易的文件服务器来实现&#xff0c;只要是在局域网内的成员都可以通过浏览器或者wget命令来下…

IDEA中添加servlet模板

官方代码链接 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end #parse("File Header.java")import javax.servlet.*; import javax.servlet.http.*;

C++奇迹之旅:构造函数和析构函数

文章目录 &#x1f4dd;类的6个默认成员函数&#x1f320; 构造函数&#x1f309; 概念&#x1f309;特性&#x1f309;三种默认构造函数 &#x1f320; 析构函数&#x1f320; 特性&#x1f6a9;总结 &#x1f4dd;类的6个默认成员函数 如果一个类中什么成员都没有&#xff0…

iOS重签名-超详细,附排错

文章目录 重签名步骤步骤 1: 准备必要的材料步骤 2: 解压 .ipa 文件步骤3:将 Provisioning Profile 复制到 Payload 目录步骤 4: 移除原来的签名步骤 5: 使用新的证书和 Provisioning Profile 进行重签名步骤 6: 重新打包 .ipa 文件步骤 7: 安装和测试得到provisioning file和…

Python编程玩转二维码

文章目录 Python编程玩转二维码第一部分&#xff1a;背景介绍第二部分&#xff1a;qrcode库是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;库函数使用方法第五部分&#xff1a;场景应用第六部分&#xff1a;常见Bug及解决方案第七部分…

微信小程序展示倒计时

html <view class"countdown"> <text>倒计时&#xff1a;</text> <text wx:for"{{countdown}}" wx:key"index">{{item}}</text> </view> ts data: {countdown: [], // 存放倒计时数组 targetTime:…

vue项目多语言配置

1. 安装 Vue I18n&#xff1a;首先安装 Vue I18n 库&#xff0c;我这里使用 npm 进行安装&#xff1a; npm install vue-i18n2. 创建语言文件&#xff1a;在你的项目中创建一个文件夹用于存放多语言文件&#xff0c;例如 locales&#xff0c;然后在这个文件夹中创建每种语言的…

【CSAPP/计组】#1 数的存储与表示方法、机器中浮点数加减法详解

文章目录 前言一、定点格式定点整数 二、浮点数的表示方法2.1 浮点数存储2.2 浮点数加减法a. 操作数检查b. 对阶c. 尾数相加与检查溢出d. 结果规格化与溢出处理e.舍入处理 Some tips: 为什么进位/双符号判断法有效的通俗解释&#xff1f;Some tips:符号位拓展 前言 计算机中常…