折半查找詳解

一:折半查找概念

????????折半查找(也稱為二分查找)是一種在有序數組中查找某一特定元素的搜索算法。搜索過程從數組的中間元素開始,如果中間元素正好是目標值,則搜索過程結束;如果目標值大于或小于中間元素,則在數組大于或小于中間元素的那一半中查找,而且同樣在那一半的中間元素開始比較。如果在某一步驟數組為空,則代表找不到。這種搜索算法每一次比較都使搜索范圍縮小一半。

二:折半查找的步驟

  1. 前提條件:數組必須是有序的。

  2. 確定搜索范圍:初始化搜索范圍的左邊界?left?為數組的第一個元素索引,右邊界?right?為數組的最后一個元素索引。

  3. 計算中間位置:計算中間位置?mid,通常使用?(left + right) / 2?的方式,為了避免整數溢出,也可以寫作?left + (right - left) / 2

  4. 比較中間元素:將目標值?target?與中間位置?mid?對應的元素進行比較。

    • 如果相等,則搜索成功,返回?mid
    • 如果目標值小于中間元素,則更新右邊界?right = mid - 1,在左半部分繼續查找。
    • 如果目標值大于中間元素,則更新左邊界?left = mid + 1,在右半部分繼續查找。
  5. 循環搜索:重復步驟 3 和 4,直到找到目標值或者搜索范圍為空(即?left > right)。

  6. 搜索失敗:如果搜索范圍為空,則目標值不在數組中,返回 -1 或其他表示未找到的值。

三.折半查找案例分析

例如:在數組array = {4, 5, 6, 7, 9, 12, 18, 23}中查找9,其代碼實現如下

public class BinarySearch {// 聲明一個靜態變量來記錄比較次數public static int comparisonCount = 0;public static int binarySearch(int[] array, int target) {if (array == null || array.length == 0) {comparisonCount = 0; // 數組為空,設置比較次數為0return -1; // 數組為空,返回-1表示未找到}int left = 0;int right = array.length - 1;while (left <= right) {comparisonCount++; // 每次比較時增加計數int mid = left + (right - left) / 2; // 防止溢出if (array[mid] == target) {return mid; // 找到目標,返回其索引} else if (array[mid] < target) {left = mid + 1; // 在右半部分繼續查找} else {right = mid - 1; // 在左半部分繼續查找}}return -1; // 沒有找到目標,返回-1}public static void main(String[] args) {int[] array = {4, 5, 6, 7, 9, 12, 18, 23};int target = 9;int result = binarySearch(array, target);if (result != -1) {System.out.println("元素 " + target + " 在數組中的索引為: " + result + "  查找的次數:" +comparisonCount);} else {System.out.println("元素 " + target + " 不在數組中" + "查找的次數" +comparisonCount);}}

?結果如下:

四:折半查找的圖解

五:折半查找的時間復雜度

????????折半查找的時間復雜度為 O(log n),可以考慮哈希表等其他數據結構提高效率

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/36947.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/36947.shtml
英文地址,請注明出處:http://en.pswp.cn/web/36947.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OceanBase 4.2.1 離線安裝

OceanBase 4.2.1 離線安裝 4.2 版本的OceanBase支持一鍵安裝&#xff0c;所以在線版本的安裝簡單了很多&#xff0c;但在無法連接網絡的情況下安裝就只能手動離線安裝。 注&#xff1a;如下安裝過程都是在同一臺機器上面進行&#xff0c;也就是只有一個節點&#xff0c;多個節…

SSM網上旅游信息管理系統-計算機畢業設計源碼06975

目 錄 摘要 1 緒論 1.1 研究背景 1.2 研究意義 1.3論文結構與章節安排 2 系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1 數據新增流程 2.2.2 數據刪除流程 2.3 系統功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系統用例分析 2.5本章小結 3 系統總體設…

Oracle、MySQL、PostGreSQL、SQL Server-查詢每秒事務數

Oracle、MySQL、PostGreSQL、SQL Server-查詢每秒事務數 在做 db benchmarks 時&#xff0c;qps、tps 是衡量數據庫性能的關鍵指標,TPS : Transactions Per Second 是每秒事務數&#xff0c;即數據庫服務器在單位時間內處理的事務數。 橫向對比計劃幾類數據庫計算tps的方法。 …

微信小程序畢業設計-垃圾分類系統項目開發實戰(附源碼+論文)

大家好&#xff01;我是程序猿老A&#xff0c;感謝您閱讀本文&#xff0c;歡迎一鍵三連哦。 &#x1f49e;當前專欄&#xff1a;微信小程序畢業設計 精彩專欄推薦&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python畢業設計…

AI產品哲學深探:從Perplexity CEO視角看搜索引擎的智慧啟示

一、開篇:歷史的分岔路口 在科技史的長河中,有些對話悄然決定了行業的走向。回溯至互聯網搜索的黎明時期,一場未被充分重視的會談在兩位科技巨擘之間展開。谷歌聯合創始人Larry Page與昔日搜索引擎巨頭Excite的CEO坐在了談判桌兩端,他們的對話不僅關乎一次潛在的并購,更預…

elasticsearch的查詢原理

數據結構 在 Elasticsearch 中,數據結構分布如下: 索引(Index) 索引是 Elasticsearch 中存儲數據的基本單元,相當于關系型數據庫中的數據庫。一個 Elasticsearch 集群中可以包含多個索引。 類型(Type) (從 Elasticsearch 7.0 開始已經被棄用): 在較早版本的 Elasticsearch…

Mathematica訓練課(46)-- 一些常用的畫圖函數

在前面的課程中&#xff0c;我們已經梳理了Plot的畫圖用法&#xff0c;今天就詳細梳理一下其他的畫圖函數用法&#xff1b; 1. 畫一條直線 2. Circle(圓) 3. Disk&#xff08;圓盤&#xff09; 4. 畫出一個矩形 5. 箭頭

c-前綴平方和序列(牛客小白月賽97)

題目&#xff1a; 假如一個長度為 n的正整數序列滿足所有前綴和 都是平方數&#xff0c;那么稱這種序列為前綴平方序列。 條件1<si<x 取模1e97 首先找出小于x的平方數有幾個。 然后用二項式定理 算出小于x的平方數中取n個的種數。 #include<bits/stdc.h> using…

大數據可視化實驗(六)——ECharts與pyecharts數據可視化

目錄 一、實驗目的... 1 二、實驗環境... 1 三、實驗內容... 1 1、ECharts可視化制作.. 1 1&#xff09;使用ECharts繪制折線圖顯示一周的天氣變換。... 1 2&#xff09;使用ECharts繪制柱狀圖顯示商品銷量的變化。... 4 2、pyecharts可視化制作.. 7 1&#xff09;使用…

beautifulSoup庫

是什么? Beautiful Soup(簡稱BS4)是一種強大而靈活的HTML和XML解析庫,廣泛用于Python爬蟲和數據采集中。相比正則表達式更加簡潔. Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的…

【知識學習】Unity3D中Shader Graph的概念及使用方法示例

Unity3D中的Shader Graph是一個強大的可視化Shader編輯工具&#xff0c;它允許用戶通過拖拽和連接節點的方式來創建Shader&#xff0c;而不是通過傳統的編寫代碼的方式。Shader Graph使得Shader的創建過程更加直觀和易于理解&#xff0c;特別是對于那些不熟悉Shader語言編程的美…

Java中的性能調優技巧與工具推薦

Java中的性能調優技巧與工具推薦 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們來探討Java中的性能調優技巧與工具推薦。Java作為一門廣泛應用的編程語…

【OpenREALM學習筆記:13】pose_estimation.cpp和pose_estimation.h

UML Class Diagram 圖中紅色框為頭文件中所涉及到的函數、變量和結構體 核心函數 PoseEstimation::process() 其核心作用為執行位姿估計的處理流程&#xff0c;并返回是否在此循環中進行了任何處理。 在這個函數中判斷并完成地理坐標的初始化或這地理坐標的更新。 這里需要…

QTreeView第一列自適應

通過setStretchLastSection(bool stretch)可以設置最后一列自適應,對于QTreeView,stretch默認為true。但有時候我們需要設置第一列自適應,比如文件瀏覽器,共有名稱、大小和修改日期三列,大小和日期的寬度幾乎是固定的,但名稱卻可長可短,此時我們希望在窗口大小變化時,第…

IDEA中Maven配置依賴和排除依賴

目錄 依賴配置 添加依賴的幾種方式&#xff1a; 1.利用中央倉庫搜索的依賴坐標 2.利用IDEA工具搜索依賴 3.熟練上手maven后&#xff0c;快速導入依賴 排除依賴 依賴配置 依賴&#xff1a;指當前項目運行所需要的jar包。一個項目中可以引入多個依賴&#xff1a; 例如&am…

python r”, b”, u”, f” 前綴詳解

1、r前綴 一般來說&#xff0c;\n’是一個換行符&#xff0c;是一個字符串&#xff1b;而加上r為前綴后&#xff0c;不會以任何特殊方式處理反斜杠。因此&#xff0c;r"\n" 是包含 ‘\’ 和 ‘n’ 的雙字符字符串&#xff1b;示例如下&#xff1a; >>> pr…

Go-知識測試-工作機制

Go-知識測試-工作機制 生成test的maintest的main如何啟動case單元測試 runTeststRunnertesting.T.Run 示例測試 runExamplesrunExampleprocessRunResult 性能測試 runBenchmarksrunNtesting.B.Run 在 Go 語言的源碼中&#xff0c;go test 命令的實現主要在 src/cmd/go/internal…

Java面試題:解釋反應式編程的概念,并討論如何在Java中使用RxJava或Project Reactor實現

反應式編程&#xff08;Reactive Programming&#xff09;是一種基于異步數據流和變化傳播的編程范式。它強調通過聲明式編程來處理異步事件流和數據流&#xff0c;簡化了復雜的異步操作和并發編程。反應式編程適用于處理異步事件、多線程處理、大量數據流、用戶交互等場景。 …

零基礎快速上手HarmonyOS ArkTS開發4---從簡單的頁面開始

接著上一次零基礎快速上手HarmonyOS ArkTS開發3---應用程序框架的繼續往下。 常用基礎組件&#xff1a; 概述&#xff1a; 關于組件的一些基礎概念就里就不多說了&#xff0c;官方有很詳細的說明&#xff0c;而在HarmonyOS按功能分有如下幾大類組件&#xff1a;基礎組件、容…

springboot筆記示例八:yml文件數據庫連接redis密碼加密實現使用jasypt加密

springboot筆記示例八&#xff1a;yml文件數據庫連接redis密碼加密實現使用jasypt加密 本文md文件下載 https://download.csdn.net/download/a254939392/89496228點擊下載本文md文件 說明 springboot中大多數配置我們都采用yml文件配置&#xff0c;比如數據庫連接&#xff…