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

学Java第四十一天-------查找算法和排序算法

一、查找算法

查找某个元素在数组的索引

1、基本查找

package com.search;public class basic_search {public static void main(String[] args) {//先定义一个数组int [] arr={1,25,30,45,18,6};System.out.println(basicSearch(arr,30));}//定义一个基本查找的函数public static int basicSearch(int[] arr, int e){for (int i = 0; i < arr.length; i++) {if(e==arr[i]){return i;}}return -1;}
}

2、二分查找/折半查找

前提:一定是有序的数组,才能用二分查找

package com.search;public class half_search {public static void main(String[] args) {//1、先定义一个数组int []arr={15,20,28,36,89,123,144};System.out.println(HalfSearch(arr,150));}//2、再定义一个方法二分查找public static int HalfSearch(int[] arr, int e){int min=0;int max=arr.length-1;while(true){if(min>max){return -1;}int mid=(max+min)/2;if(arr[mid]>e){max=mid-1;}else if(arr[mid]<e){min=mid+1;}else{return mid;}}}
}

总结:

3、分块查找

代码:

1、先定义一个块的类

package com.search;public 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;}public int getEndindex() {return endindex;}public void setEndindex(int endindex) {this.endindex = endindex;}public int getStartindex() {return startindex;}public void setStartindex(int startindex) {this.startindex = startindex;}public int getMax() {return max;}public void setMax(int max) {this.max = max;}}

2、再写查找方法

package com.search;public class BlockSearch {public static void main(String[] args) {//1、先定义一个数组int [] arr={21,16,15,24,45,182,136,145,226,308,432};int number=2265;//2、找到元素number在哪一块//分成三个块Block b1=new Block(24,0,3);Block b2=new Block(182,4,7);Block b3=new Block(432,8,10);//把三个块变成一个块数组Block [] Brr={b1,b2,b3};//调用函数blockSearch(Brr, number, arr);}private static void blockSearch(Block[] Brr, int number, int[] arr) {int blockIndex=findBlockIndex(Brr, number);if(blockIndex==-1){System.out.println("没有该元素");return;}int start= Brr[blockIndex].getStartindex();int end= Brr[blockIndex].getEndindex();boolean f=false;for (int i =start; i <=end; i++) {if(number == arr[i]){System.out.println(i);f=true;}}if(!f){System.out.println("没有该元素");}}public static int findBlockIndex(Block []arr,int number) {for (int i = 0; i < arr.length; i++) {if (arr[i].getMax() > number) {return i;}}return -1;}}

注意:

1)在写一个方法时,有循环判断的话,一定要在循环外也写一个return值,不然如果循环判断里面的不达标,就会没有返回值,所以一定要在循环外面写返回值。

2)接收回来的函数值,一定要判断其可能的取值范围,在下面用的时候,要防止数组索引越界

二、排序算法

1、冒泡排序

代码:

2、选择排序


代码:

package com.sort;public class SelectSearch {public static void main(String[] args) {int []arr={1,5,8,2,10,4};for (int i = 0; i < arr.length-1; i++) {for (int j = i+1 ; j < arr.length; j++) {if(arr[i]>arr[j]){int tmp=arr[i];arr[i]=arr[j];arr[j]=tmp;}}}printARR(arr);}public static void printARR(int []arr){for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+"  ");}}
}

3、插入排序和递归算法

代码:

package com.sort;public class InsertSort {public static void main(String[] args) {int[]arr={1,5,9,2,4,6,3};//得到无序的那一组的开始索引int startindex=-1;for (int i = 0; i < arr.length; i++) {if(arr[i]>arr[i+1]){startindex=i+1;break;}}for (int i = startindex; i < arr.length; i++) {int j=i;while((j>0)&&(arr[j]<arr[j-1])){int tmp=arr[j];arr[j]=arr[j-1];arr[j-1]=tmp;j--;}}printARR(arr);}public static void printARR(int []arr){for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+"  ");}}
}

4、快速排序

递归算法:递归指的是方法中调用方法本身的现象。

递归一定要有出口,不然栈内存会溢出报错


递归练习题1:

递归练习题2:

先知道递归函数的方法体是什么,重复的部分就是方法体,之后再找出口,写在方法体中。

快速排序代码:

package com.sort;import java.util.Arrays;public class QuickSort {public static void main(String[] args) {int [] arr={9,2,5,7,6,4,3};QuickSort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}public static void QuickSort(int []arr,int start,int end){//最后一定不要忘了写出口!!!if(start>end){return;}//要先有基准元素int BaseElem=arr[start];int i=start;int j=end;//必须先右指针while(i!=j){while(true){if(i==j||arr[j]<BaseElem){break;}j--;}//之后才是左指针while (true){if(i==j||arr[i]>BaseElem){break;}i++;}//此时找到了左右指针对应的元素,进行交换int tmp=arr[i];arr[i]=arr[j];arr[j]=tmp;}//当这样一个循环完成之后,i=j=baseElem应该存放的地方//将基准元素放到i=j之处,算是完成一次“归位”int tmpp=arr[start];arr[start]=arr[i];arr[i]=tmpp;QuickSort(arr,start,i-1);QuickSort(arr,i+1,end);}
}
出口关键点分析:

这里面的出口不能写成 if(start==end) return;   ----------因为当9在最右边归位时,第二个递归

QuickSort(arr,i+1,end);也要运行,但当运行该函数时,就变成了QuickSort(arr,7,6),这时start!=end,无法出去,而且arr[7]还会数组越界报错,所以出口只写==是不行的,要写>或者>=

还有一种情况是第一个元素已经是最小的,第一次就能归位,那么,左递归就变成了

QuickSort(arr,0,-1);这是start>end,可以找到出口,所以一定要想到特殊情况,防止递归的出口写错。

解析:

排序总结

http://www.dtcms.com/a/577585.html

相关文章:

  • 从0到1学习Qt -- 信号和槽(二)
  • AI、闪购、造车……双十一的第十七年,京东、阿里、美团还有“新活”
  • IDEA不切换当前分支,实现跨分支合并的终极方案
  • 法考资源合集
  • Redis(四)——事务
  • 便宜的vps租用网站有哪些网站使用ftp
  • TestKeyDownBit函数和SetKeyDownBit函数和ClearKeyDownBit函数分析
  • RHCSA---权限管理
  • Flutter for HarmonyOS开发指南(二):混合开发架构与通信机制
  • 分布式分片执行原理解析
  • 自主建站全攻略:建站系统的选择指南与深度说明
  • 什么网站有做qq群排名的关键词优化价格
  • 网站内容怎么进行编写
  • SSM 房屋租赁系统
  • 网站排名优化服务公司福建省住房和城乡建设网站
  • 开发集成热门小游戏(vue+js)
  • Java-简单项目开发流程
  • 莱芜网站优化平台现在中型公司做网站用的是什么框架
  • 区块链-B站API程序系统方案
  • LVS三种模式及调度算法解析
  • MySql 9.5.0(2025)-Windows安装步骤
  • 查看 MySQL 数据库里的所有信息,包括表结构、数据内容
  • Rocky10 使用kubeadm 安装k8s 单节点
  • K8s 中的Serviceaccount
  • MySQL 事务的两种使用方式
  • 【MySQL 进阶】高性能优化
  • 如何做静态页网站wordpress swf 上传
  • Dotnet-Dapper的用法
  • 深入理解 Spring Boot 中的数据库迁移:Flyway 与 Liquibase 实战指南
  • 使用visa进行仪器控制