網(wǎng)站首頁 編程語言 正文
二分查找:
二分查找也叫折半查找,也就是把n個(gè)元素拆成一半一半查找。二分查找有兩個(gè)要求第一個(gè)是要是有序的數(shù)列,第二個(gè)是必須存儲(chǔ)在連續(xù)的存儲(chǔ)結(jié)構(gòu)中。假如數(shù)列是無序的,可以先使用排序算法排序。
實(shí)現(xiàn):
分析:
1.定義個(gè)中間值middle,middle=(left+rigth)/2。把他做為要查找值的下標(biāo)。
2.查找值key和middle比較:
key>middle說明查找值在middle的右邊,改變left的值,left=middle+1.從而也改變了中間值。
key<middle查找值在middle的左邊,改變r(jià)igth的值,rigth=middle-1.
key=middle時(shí),輸出下標(biāo)middle。
注意我們何時(shí)結(jié)束查找呢
1.找到了查找值,結(jié)束。
2.left>rigth時(shí)結(jié)束(不是在循環(huán)中寫left>rigth,這樣會(huì)沒有輸出結(jié)果)
實(shí)現(xiàn):
不遞歸的:
package day07;/*
Author:
date:
problem: 二分查找:(不遞歸)
/*
1.不遞歸的可以用while循環(huán)。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;//定義一個(gè)中間值,查找的下標(biāo)
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) {//當(dāng)left>rigth時(shí)結(jié)束,說明已經(jīng)循環(huán)完數(shù)組了
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);
}
}
優(yōu)化思考:
1.數(shù)列有序,有重復(fù)值。
數(shù)列是升序排序,但數(shù)列中重復(fù)的值如{1,2,3,4,2,2,2,2,}我們查找2這個(gè)數(shù)時(shí),只會(huì)輸出第一重復(fù)值的下標(biāo)
找到這個(gè)數(shù)的右邊界,rigth–.
package day07;/*
Author:
date:
problem: 二分查找:(不遞歸)
/*
1.不遞歸的可以用while循環(huán)。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;//定義一個(gè)中間值,查找的下標(biāo)
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) {//當(dāng)left>rigth時(shí)結(jié)束,說明已經(jīng)循環(huán)完數(shù)組了
middle = (left + rigth) / 2;
if (key > array0[middle]) {
left = middle + 1;
} else if (key < array0[middle]) {
rigth = middle - 1;
} if (key == array0[middle]) {//有重復(fù)的數(shù),可以收縮右邊界,找到最邊上的
rigth--;
i=middle;
}
}System.out.println(i);
}
}
原文鏈接:https://blog.csdn.net/qq_50692350/article/details/125629675
相關(guān)推薦
- 2023-10-26 在el-table中根據(jù)判斷不同值顯示對(duì)應(yīng)文本
- 2022-03-26 R語言繪制尺子的實(shí)現(xiàn)示例_R語言
- 2022-04-20 從0編寫區(qū)塊鏈之用python解釋區(qū)塊鏈最基本原理_python
- 2022-07-25 Android開發(fā)之Fragment懶加載的幾種方式及性能對(duì)比_Android
- 2022-05-20 Redis 做接口限流,一個(gè)注解的事
- 2022-07-22 常見的哈希算法總結(jié)
- 2023-10-09 所有的引用類型都有自由可拓展性怎么理解
- 2022-05-11 深入理解AQS之獨(dú)占鎖ReentrantLock源碼分析
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支