查找算法和排序算法

文章目录

  • 1.基本查找
    • 1.1需求一:
    • 1.2需求二:
  • 2.二分查找
  • 3.分块查找
    • 3.1分块查找的扩展
  • 4.冒泡排序
  • 5.选择排序
  • 6.插入排序
  • 7.快速排序(递归算法)

1.基本查找

在数组或集合中挨个元素查找需要的元素

1.1需求一:

需求:定义一个方法利用基本查找,查询某个元素是否存在
数据如下:{131,127,147,81,103,23,7,79}

public static void main(String[] args) {  int[] arr1 = {131,127,147,81,103,23,7,79};  System.out.println(Check(arr1,131));  }  public static boolean Check(int[] arr,int num){  for (int i = 0; i < arr.length; i++) {  if(arr[i] == num){  return true;  }  }  return false;  }  
}

1.2需求二:

需求:定义一个方法利用基本查找,查询某个元素在数组中的索引
要求:需要考虑数组中元素有重复的可能性 {131,127,147,81,103,23,7,79,81}
查找81,想要返回的是所有索引3 8
==//如果需要返回多个数据,则把数据放在数组或集合中,将数组或集合返回就可以了 ==

public static void main(String[] args) int[] arr = {131,127,147,81,103,23,7,79,81};  ArrayList<Integer> list1 = new ArrayList<>();  list1 = Check(arr,81);  for (int i = 0; i < list1.size(); i++) {  System.out.print(list1.get(i)+" ");  }  
}//如果需要返回多个数据,则把数据放在数组或集合中,将数组或集合返回就可以了  
public static ArrayList<Integer> Check(int[] arr, int num){  //创建一个新的集合来放多个索引  ArrayList<Integer> list = new ArrayList<>();  for (int i = 0; i < arr.length; i++) {  if(arr[i] == num){  list.add(i);  }  }  return list;  
}

2.二分查找

前提条件: 数组中的数据必须是有序的
核心逻辑: 每次排除一半的查找范围

1)min和max表示当前要查找的范围
2)mid是在min和max中间的
3)如果要查找的元素在mid的左边,缩小范围时,min不变,max等于mid减1
4)如果要查找的元素在mid的右边,缩小范围时,max不变,min等于mid加 1

 int[] arr = {7,23,79,81,103,127,131,147};  System.out.println(Check(arr,79));  
}  
public static int Check(int[] arr ,int num){  int min = 0;  int max = arr.length - 1;  while(true){  if(min > max){  return -1;  }  //找到min和max的中间位置  int mid = (min + max) / 2;  if(arr[mid] > num){  max = mid - 1;  }else if(arr[mid] < num){  min = mid + 1;  }else{  return mid;  }  }

3.分块查找

分块的原则1:前一块中的最大数据,小于后一块中所有的数据(块内无序,块间有序)
分块的原则2:块数数量一般等于数字的个数开根号。比如:16个数字一般分为4块左右。
核心思路:先确定要查找的元素在哪一块,然后在块内挨个查找。

1)创建标准的javaBean类,每一块创建一个对象,再把对象放进数组中

//javaBean类里需要存在的三个成员变量private int max;//每一块中的最大值  private int startIndex;//块的起始索引  private int endIndex;//块的结束索引
  int[] arr={16,5,9,12,21,18,//前一块的最大值必须比后一块的所有值都要小  32,23,37,26,45,34,  50,48,61,52,73,66};  
//      System.out.println(arr.length);//arr的长度为18,至少将arr分成4块  //创建块的对象  Block b1 = new Block(21,0,5);  Block b2 = new Block(45,6,11);  Block b3 = new Block(73,12,17);  //把三个对象放进数组里  Block[] b = {b1,b2,b3};  //定义一个变量来记录需要查找的元素  int num = 45;  System.out.println(getIndex(b,num,arr));

2)定义一个方法找到元素所在的块的下标

//先确定num在哪一块中  public static int getIndexBlock(Block[] b,int num){  
//        Block b1 = new Block(21,0,5);-----0  
//        Block b2 = new Block(45,6,11);----1  
//        Block b3 = new Block(73,12,17);---2  //从0索引开始遍历b数组,如果num小于max,则表示num在这一块当中  for (int i = 0; i < b.length; i++) {  if(num <= b[i].getMax()){  return i;//返回块的下标  }  }  return -1;//查找的数据不在表中  }

3)从块的下标中找到对应块的开始索引和节数索引,遍历块并找到元素

//确定了num在哪一块中,再去那块中寻找num的索引  
public static int getIndex(Block[] b,int num,int[] arr){  int indexBlock = getIndexBlock(b,num);//得到返回的块的下标  if(indexBlock == -1){//返回-1则表示数据不在数组中  return -1;  }else{  int startIndex = b[indexBlock].getStartIndex();//得到块的开始索引  int endIndex = b[indexBlock].getEndIndex();//得到块的结束索引  for (int i = startIndex; i <= endIndex; i++) {//从开始索引遍历到结束索引  if(arr[i] == num){  return i;  }  }  return -1;  }

3.1分块查找的扩展

主要用于没有规律的数据
1)分块时,块与块之间不能有交集
2)分块查找的拓展比正常的分块查找的javaBean类多了一个成员变量
private int min;

4.冒泡排序

冒泡排序: 相邻的数据两两比较,小的放前面,大的放后面

public static void main(String[] args) {//冒泡排序  int[] arr={5,3,2,1,4};  //外循环,表示要执行多少轮,如果有n个数据,则执行n-1轮  for (int i = 0; i < arr.length; i++) {  //内循环:每一轮中比较数据找到当前的最大值  //-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;  }  }  }  for (int i = 0; i < arr.length; i++) {//遍历数组,看冒泡排序是否成功  System.out.print(arr[i] + " ");//1 2 3 4 5  }  
}

5.选择排序

从0索引开始,拿着每一个索引上的元素跟后面的元素依次比较,小的放前面,大的放后面,以此类推。

    int[] arr={5,3,2,1,4};  //外循环:几轮  for (int i = 0; i < arr.length; i++) {  //内循环,拿着i和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;  }  }  }  
}

6.插入排序

将0索引的元素到n索引的元素看作是有序的,把n+1索引的元素到最后一个当成是无序的。遍历无序的数据,将遍历的元素插入有序序列中的适当位置,如果遇到相同数据,则插在后面

1.找到无序的那一组数组是从哪个索引开始的

//思路:如果前一个数据大于后一个数据,则该后一个数据就是无序数组的开始  //例:44>38 则38就是无序数组的开始 44就是有序数组的结束  for (int i = 0; i < arr.length; i++) {  if(arr[i] > arr[i + 1]){  System.out.println(i);//1 表示有序数组到1索引就结束了  break;  }  }  
}

2.//把无序数组的数据插入到有序数组中

//遍历从startIndex开始到最后一个元素,依次得到无序的那一个数组中的每个元素  
for (int i = startIndex; i < arr.length; i++) {  for (int j = 0 ; j <= i; j++) {  if(arr[j] > arr[i]){//arr[j]为有序数组的数据 arr[i]为无序数组的数据  //若arr[j]>arr[i] 则为后面的数据大于前面的数据 需要交换位置  int temp = arr[j];  arr[j] = arr[i];  arr[i] = temp;  }  }  
}  
for (int i = 0; i < arr.length; i++) {  System.out.print(arr[i] + " ");  
}

7.快速排序(递归算法)

递归: 自己调用自己
递归一定要有出口,否则就会内存溢出

第一轮:把0索引的数字作为基准数,确定基准数在数组中正确的位置
比基准数小的全部在左边,比基准数大的全部在右边。

 public static void main(String[] args) {  
//        快速排序:  
//        第一轮:以0索引的数字为基准数,确定基准数在数组中正确的位置。  
//        比基准数小的全部在左边,比基准数大的全部在右边。  
//        后面以此类推  int[] arr={6,1,2,7,9,3,4,5,10,8};  quickSort(arr,0,arr.length - 1);  for (int i = 0; i < arr.length; i++) {  System.out.print(arr[i] + " ");  }  }  //参数一:我们要排序的数组  //参数二:要排序的数组的起始索引  //参数三,要排序数组的结束索引  public static void quickSort(int[] arr,int i,int j){  int start = i;//记录数组的起始位置  int end = j;  int baseNumber = arr[i];  while(start != end){  //用end ,从后开始往前找比基准数小的数字  while(true){  if(end <= start || arr[end] < baseNumber){  break;  }  end--;  }  //用start,从前开始往后找比基准数大的数字  while(true){  if(end <= start || arr[start] > baseNumber){//找到值后结束循环,并挪动start指向的位置  break;  }  start++;  }  //把end和start元素进行交换  int temp = arr[start];  arr[start] = arr[end];  arr[end] = temp;  }  //基准数归位,将start下标的和基准数交换位置  int temp = arr[start];  arr[start] = arr[i];  arr[i] = temp;  
//        int temp = arr[start];  
//        arr[start] = baseNumber;  
//        baseNumber = temp;  //虽然arr[i]=baseNumber 此处改变的事baseNumber的值,并没有改变数组中的基准值,所以要用arr[i]来实现交换  }

第二轮,基准值左边的使用递归重新定义基准值和进行快速排序,右边同理\

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

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

相关文章

威胁 Windows 和 Linux 系统的新型跨平台勒索软件:Cicada3301

近年来&#xff0c;网络犯罪世界出现了新的、日益复杂的威胁&#xff0c;能够影响广泛的目标。 这一领域最令人担忧的新功能之一是Cicada3301勒索软件&#xff0c;最近由几位网络安全专家进行了分析。他们有机会采访了这一危险威胁背后的勒索软件团伙的成员。 Cicada3301的崛…

微信小程序中关闭默认的 `navigationBar`,并使用自定义的 `nav-bar` 组件

要在微信小程序中关闭默认的 navigationBar&#xff0c;并使用自定义的 nav-bar 组件&#xff0c;你可以按照以下步骤操作&#xff1a; 1. 关闭默认的 navigationBar 在你的页面的配置文件 *.json 中设置 navigationBar 为 false。你需要在页面的 JSON 配置文件中添加以下代码…

C#从零开始学习(用户界面)(unity Lab4)

这是书本中第四个unity Lab 在这次实验中,将学习如何搭建一个开始界面 分数系统 点击球,会增加分数 public void ClickOnBall(){Score;}在OneBallBehaviour类添加下列方法 void OnMouseDown(){GameController controller Camera.main.GetComponent<GameController>();…

js纯操作dom版购物车(实现购物车功能)

代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title>&l…

jenkins国内插件源

Jenkins是一个开源的持续集成和持续部署&#xff08;CI/CD&#xff09;工具, 可以大大减轻部署的工作量, 但是jenkins作为一个国外的软件, 在国内下载插件会很麻烦, 因此我们可以将其换为国内源 更换步骤 替换国内插件下载地址 以linux为例 首先, jenkins初始化完成之后不会…

如何制作一台自己想要的无人机?无人机改装调试技术详解

制作一台符合个人需求的无人机并对其进行改装调试&#xff0c;是一个既具挑战性又充满乐趣的过程。以下是从设计、选购材料、组装、调试到改装的详细步骤&#xff1a; 一、明确需求与设计 1. 明确用途与性能要求&#xff1a; 确定无人机的使用目的&#xff0c;如航拍、比赛、…

推荐一款功能强大的数据备份工具:Iperius Backup Full

Iperius Backup是一款非常灵活而且功能强大的数据备份工具&#xff0c;程序可以非常好的保护您的文件和数据的安全。支持DAT备份、LTO备份、NAS备份、磁带备份、RDX驱动器、USB备份、并且支持zip压缩和军事级别的AES 256位数据加密技术! 主要特色 云备份 Iperius可以自动地发…

.net 根据html的input type=“week“控件的值获取星期一和星期日的日期

初始化 "week" 控件值&#xff1a; //MVC部分 public ActionResult WeeklyList() {int weekNo new GregorianCalendar().GetWeekOfYear(System.DateTime.Now, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Sunday);string DefaultWeek DateTime.No…

代码随想录算法训练营Day39 | 卡玛网-46.携带研究材料、416. 分割等和子集

目录 卡玛网-46.携带研究材料 416. 分割等和子集 卡玛网-46.携带研究材料 题目 卡玛网46. 携带研究材料&#xff08;第六期模拟笔试&#xff09; 题目描述&#xff1a; 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成…

论文速读:YOLO-G,用于跨域目标检测的改进YOLO(Plos One 2023)

原文标题&#xff1a;YOLO-G: Improved YOLO for cross-domain object detection 中文标题&#xff1a;YOLO-G&#xff1a;用于跨域目标检测的改进YOLO 论文地址&#xff1a; 百度网盘 请输入提取码 提取码&#xff1a;z8h7 代码地址&#xff1a; GitHub - airy975924806/yolo…

基于springboot企业微信SCRM管理系统源码带本地搭建教程

系统是前后端分离的架构&#xff0c;前端使用Vue2&#xff0c;后端使用SpringBoot2。 技术框架&#xff1a;SpringBoot2.0.0 Mybatis1.3.2 Shiro swagger-ui jpa lombok Vue2 Mysql5.7 运行环境&#xff1a;jdk8 IntelliJ IDEA maven 宝塔面板 系统与功能介绍 基…

C++ —— 《模板进阶详解》,typename和class的用法,非类型模板参数,模板的特化,模板的分离编译

目录 1.非类型模板参数 2.模板特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 2.3.2 偏特化 3 模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 4.模板总结 在讲解模板进阶之前&#xff0c;我想先简单单独聊聊class和typename的用法 我们在平时…

博弈论 C++

前置知识 若一个游戏满足&#xff1a; 由两名玩家交替行动在游戏进行的任意时刻&#xff0c;可以执行的合法行动与轮到哪位玩家无关不能行动的玩家判负 则称该游戏为一个公平组合游戏。 尼姆游戏&#xff08;NIM&#xff09;属于公平组合游戏&#xff0c;但常见的棋类游戏&…

ASP.NET Core开发Chatbot API

本文介绍基于ASP.NET Core的Chatbot Restful API开发&#xff0c;通过调用大语言模型的SDK&#xff0c;完成一个简单的示例。并且通过容器化进行部署. 安装 首先需要安装.NET环境&#xff0c;笔者在Ubuntu 22.04通过二进制包进行安装&#xff0c;Windows和Mac下都有installer…

终止,半成收入来自海外,收入可持续性被质疑

芬尼科技终止原因如下&#xff1a;芬尼科技4年期间经历了两次IPO失败&#xff0c;公司半成收入来自海外&#xff0c;然而公司泳池收入面临欧洲地区冲突冲击及德国新节能措施影响。交易所质疑其收入是否具有可持续性。 作者&#xff1a;Eric 来源&#xff1a;IPO魔女 9月25日&a…

使用HIP和OpenMP卸载的Jacobi求解器

Jacobi Solver with HIP and OpenMP offloading — ROCm Blogs (amd.com) 作者&#xff1a;Asitav Mishra, Rajat Arora, Justin Chang 发布日期&#xff1a;2023年9月15日 Jacobi方法作为求解偏微分方程&#xff08;PDE&#xff09;的基本迭代线性求解器在高性能计算&#xff…

Webserver(2)GCC

目录 安装GCCVScode远程连接到虚拟机编写代码gcc编译过程gcc与g的区别Xftp连接虚拟机上传文件 安装GCC sudo apt install gcc g查看版本是7.5 touch test.c创建代码 但是在虚拟机中写代码很不方便 VScode远程连接到虚拟机编写代码 gcc test.c -o app在虚拟机中用gcc编译的…

AtCoder ABC376A-D题解

个人觉得 ABC 变得越来越难了/kk/kk/kk 比赛链接:ABC376 Problem A: Code #include <bits/stdc.h> using namespace std; int main(){int N,C;cin>>N>>C;for(int i1;i<N;i)cin>>T[i];int ans0,pre-1e5;for(int i1;i<N;i){if(T[i]-pre>C){…

APP专项测试-冷启动-流量-电量-内存

1、响应时间 1.1怎么获取冷启动时间&#xff08;热启动&#xff0c;就是后台不关后台再次打开&#xff09; 方法一 1.2怎么获取包名 与 启动页 方法三soloPi&#xff1a;启动时间(用户角度出发&#xff0c;页面差异进行计算时间)&#xff1a; 然后默认配置。点击开始录制 1开…

未来汽车驾驶还会有趣吗?车辆动力学系统简史

未来汽车驾驶还会有趣吗&#xff1f;车辆动力学系统简史 本篇文章来源&#xff1a;Schmidt, F., Knig, L. (2020). Will driving still be fun in the future? Vehicle dynamics systems through the ages. In: Pfeffer, P. (eds) 10th International Munich Chassis Symposiu…