二分查找算法
1、概念
二分查找属于递归查找的一种,其主要思想是将一个有序数组,分为二分,进行递归,反复为之。
2、实际应用
请对一个有序数组进行二分查找{1,8,10,89,1000,1234},输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。
3、思路
4、代码实现
package com.qf.search;
import java.util.ArrayList;
import java.util.List;
public class SeqSearch {
/**
* 二分查找
* @param args
*/
public static void main(String[] args) {
//有序的数组
int[] arr={1,8, 10, 89, 1000,1234};
int i = seqSearch(arr, 0, arr.length - 1, 1000);
System.out.println("查找到的下标位置:"+i);
}
public static int seqSearch(int[] arr,int left,int right,int findValue){
//跳出循环
if (left>right){
return -1;
}
//找出中间的位置
int mid=(left+right)/2;
//中间的位置与要找的值进行对比
int midValue=arr[mid];
if (midValue<findValue){
//向右查找
return seqSearch(arr,mid+1,right,findValue);
}else if (midValue>findValue){
//向左查找
return seqSearch(arr,left,mid-1,findValue);
}else{
//相等,找到
return mid;
}
}
}
5、思考题:
{1,8, 10, 89, 1000, 1000,1000,1000,1234} 当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的 1000.
6、优化实现
package com.qf.search;
import java.util.ArrayList;
import java.util.List;
public class SeqSearch {
/**
* 二分查找
* @param args
*/
public static void main(String[] args) {
//有序的数组
int[] arr={1,8, 10, 89, 1000, 1000,1000,1000,1234};
List<Integer> integerList = seqSearch2(arr, 0, arr.length - 1, 1000);
System.out.println("查找到的下标位置:"+integerList);
}
public static int seqSearch(int[] arr,int left,int right,int findValue){
if (left>right){
return -1;
}
//找出中间的位置
int mid=(left+right)/2;
//中间的位置与要找的值进行对比
int midValue=arr[mid];
if (midValue<findValue){
//向右查找
return seqSearch(arr,mid+1,right,findValue);
}else if (midValue>findValue){
//向左查找
return seqSearch(arr,left,mid-1,findValue);
}else{
//相等,找到
return mid;
}
}
public static List<Integer> seqSearch2(int[] arr, int left, int right, int findValue){
List<Integer> list=new ArrayList<>();
if (left>right){
return list;
}
//找出中间的位置
int mid=(left+right)/2;
//中间的位置与要找的值进行对比
int midValue=arr[mid];
if (midValue<findValue){
//向右查找
return seqSearch2(arr,mid+1,right,findValue);
}else if (midValue>findValue){
//向左查找
return seqSearch2(arr,left,mid-1,findValue);
}else{
//相等,找到
int temp=mid;
//向左查找与findValue相等的数值
while (true){
if (temp<left||arr[temp]!=findValue){
break;
}
list.add(temp);
temp--;
}
//向右查找与findValue相等的数值
temp=mid+1;
while (true){
if (temp>right||arr[temp]!=findValue){
break;
}
list.add(temp);
temp++;
}
return list;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix