網站首頁 編程語言 正文
二分查找:
二分查找也叫折半查找,也就是把n個元素拆成一半一半查找。二分查找有兩個要求第一個是要是有序的數列,第二個是必須存儲在連續的存儲結構中。假如數列是無序的,可以先使用排序算法排序。
實現:
分析:
1.定義個中間值middle,middle=(left+rigth)/2。把他做為要查找值的下標。
2.查找值key和middle比較:
key>middle說明查找值在middle的右邊,改變left的值,left=middle+1.從而也改變了中間值。
key<middle查找值在middle的左邊,改變rigth的值,rigth=middle-1.
key=middle時,輸出下標middle。
注意我們何時結束查找呢
1.找到了查找值,結束。
2.left>rigth時結束(不是在循環中寫left>rigth,這樣會沒有輸出結果)
實現:
不遞歸的:
package day07;/*
Author:
date:
problem: 二分查找:(不遞歸)
/*
1.不遞歸的可以用while循環。middle=left+rigth/2
2.left=0,ringth=array0.length用if判斷是不是大于如果大于就把交換
*/
import java.util.Scanner;
public class binayarray {
public static void main(String[] args) {
int[] array0 = {1, 4, 6, 9, 10, 12, 14, 16, 18};
int middle=0;//定義一個中間值,查找的下標
int left = 0;
int i=0;
int rigth = array0.length - 1;
System.out.println("請輸入要查找的值");
Scanner sca = new Scanner(System.in);
int key = sca.nextInt();
while (left<=rigth) {//當left>rigth時結束,說明已經循環完數組了
middle = (left + rigth) / 2;
if (key > array0[middle]) {
left = middle + 1;
} else if (key < array0[middle]) {
rigth = middle - 1;
} if (key == array0[middle]) {
i=middle;
}
}System.out.println(i);
}
}
優化思考:
1.數列有序,有重復值。
數列是升序排序,但數列中重復的值如{1,2,3,4,2,2,2,2,}我們查找2這個數時,只會輸出第一重復值的下標
找到這個數的右邊界,rigth–.
package day07;/*
Author:
date:
problem: 二分查找:(不遞歸)
/*
1.不遞歸的可以用while循環。middle=left+rigth/2
2.left=0,ringth=array0.length用if判斷是不是大于如果大于就把交換
*/
import java.util.Scanner;
//尋找邊界值
public class binayarray {
public static void main(String[] args) {
int[] array0 = {1, 4, 6, 9, 9, 9, 14, 16, 18};
int middle=0;//定義一個中間值,查找的下標
int left = 0;
int i=0;
int rigth = array0.length - 1;
System.out.println("請輸入要查找的值");
Scanner sca = new Scanner(System.in);
int key = sca.nextInt();
while (left<=rigth) {//當left>rigth時結束,說明已經循環完數組了
middle = (left + rigth) / 2;
if (key > array0[middle]) {
left = middle + 1;
} else if (key < array0[middle]) {
rigth = middle - 1;
} if (key == array0[middle]) {//有重復的數,可以收縮右邊界,找到最邊上的
rigth--;
i=middle;
}
}System.out.println(i);
}
}
原文鏈接:https://blog.csdn.net/qq_50692350/article/details/125629675
- 上一篇:給復雜的數組結構數據換key
- 下一篇:常見的dos命令
相關推薦
- 2022-08-05 雪花算法工具類
- 2023-12-14 Excel中——日期列后添加星期
- 2022-04-11 canvas實現畫板功能
- 2022-09-29 React函數組件useContext?useReducer自定義hooks_React
- 2022-10-13 react-router?v6實現動態路由實例_React
- 2023-07-22 垃圾回收的核心知識點解析
- 2022-05-04 python?與c++相互調用實現_python
- 2023-01-19 pip如何用pipdeptree查看包依賴_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支