輕松拿捏C語言——二分查找

🥰歡迎關注?輕松拿捏C語言系列,來和 小哇 一起進步!?

🌈感謝大家的閱讀、點贊、收藏和關注💕


目錄🎉

?一、介紹🌈

二、步驟🌙

三、代碼??


?

?一、介紹

二分查找是一種在有序數組中查找某一特定元素的搜索算法。

舉個生活中的例子,當我們要去圖書館借書時,知道了要找的圖書編號,我們可以在一個大致范圍的中間查找,然后在決定往前找還是往后找。這樣就能比一本一本地找更加快速。

搜索過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結束;

如果某一特定元素大于或者小于中間元素,則在數組大于或小于中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。

如果在某一步驟數組為空,則代表找不到。這種搜索算法每一次比較都使搜索范圍縮小一半。

二、步驟

  1. 確定搜索范圍,即數組的下標范圍left和right。
  2. 計算中間元素的下標mid = (left + right) / 2(注意整數除法)。

? ? ? ??但是像這樣求平均值,如果數字太大了超過int類型能表示的最大范圍,這種算法就會有問題,整數會溢出。

? ? ? ? 所以我們可以換一個思路,把兩數的差值的一半 加到另一個數字中:

? ? ? ? mid = left + (right-left) /2?

  1. 判斷中間元素與目標值的大小關系。
    • 如果相等,則返回中間元素的下標。
    • 如果目標值小于中間元素,則在左半部分繼續搜索(right = mid - 1)。
    • 如果目標值大于中間元素,則在右半部分繼續搜索(left = mid + 1)。
    • 如果搜索范圍left大于right,則表示數組中沒有目標值,返回-1或其他表示未找到的值。

三、代碼

法一:用遞歸實現

#include <stdio.h>  int Sort(int arr[], int left, int right, int Key) {  if (left > right) return -1; // 搜索范圍無效  int mid = left + (right - left) / 2;  //這種寫法可避免溢出if (arr[mid] == Key) {  return mid; // 找到目標,返回下標  } else if (arr[mid] > Key) {  return Sort(arr, left, mid - 1, Key); // 在左半部分繼續搜索  } else {  return Sort(arr, mid + 1, right, Key); // 在右半部分繼續搜索  }  
}  int main() {  int arr[] = {1, 3, 5, 7, 9};  int key = 5;  int n = sizeof(arr) / sizeof(arr[0]);  int ret = Sort(arr, 0, n - 1, key);  if (ret != -1) {  printf("元素 %d 在數組中的下標為 %d\n", key, ret);  } else {  printf("元素 %d 不在數組中\n",key);  }  return 0;  
}

法二:用循環實現

#include <stdio.h>  int Sort(int arr[], int N, int Key) 
{  int left = 0;int right = N - 1;  while (left <= right) {  int mid = left + (right - left) / 2;  if (arr[mid] == Key) {  return mid;  } else if (arr[mid] > Key){  right = mid - 1;  }else{  left = mid + 1;  }  }  return -1; // 未找到目標值  
}  int main()
{  int arr[] = {1, 3, 5, 7, 9};  int key = 5;  int n = sizeof(arr) / sizeof(arr[0]);  int ret = Sort(arr, n, key);  if (ret != -1) {  printf("元素 %d 在數組中的下標為 %d\n", key, ret);  } else {  printf("元素 %d 不在數組中\n",key);  }  return 0;   
}

使用循環的方式來實現二分查找,更直觀且易于理解。

不過,遞歸的方式在某些情況下可能更簡潔。

無論使用哪種方式,都需要確保數組是有序的,因為二分查找的前提是有序數組。?


?

?🎉🎉🎉本文內容結束啦,希望各位大佬多多指教!

🌹🌹感謝大家三連支持

💕敬請期待下篇文章吧~

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

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

相關文章

【Linux-驅動開發】

Linux-驅動開發 ■ Linux-應用程序對驅動程序的調用流程■ Linux-file_operations 結構體■ Linux-驅動模塊的加載和卸載■ 1. 驅動編譯進 Linux 內核中■ 2. 驅動編譯成模塊(Linux 下模塊擴展名為.ko) ■ Linux-■ Linux-■ Linux-設備號■ Linux-設備號-分配■ 靜態分配設備號…

React Native 之 主題偏好(十一)

如果你的 React Native 版本較新&#xff0c;它提供一個主題API useColorScheme&#xff0c;你可以直接使用它。如果不是&#xff0c;需安裝額外的庫&#xff0c;如react-native-appearance。 下面是一個使用 react-native-appearance&#xff08;或 useColorScheme&#xff0…

家電維修上門維修小程序怎么搭建制作?

?在家庭生活中&#xff0c;家電的維修問題一直是人們關注的焦點。隨著微信小程序的普及&#xff0c;家電維修服務行業也迎來了線上轉型的機遇。一款便捷、高效的家電維修上門維修小程序&#xff0c;不僅能為維修服務商帶來新的客戶&#xff0c;也能為用戶帶來更便捷的服務體驗…

[Algorithm][動態規劃][路徑問題][下降路徑最小和][最小路徑和][地下城游戲]詳細講解

目錄 1.下降路徑最小和1.題目鏈接2.算法原理詳解3.代碼實現 2.最小路徑和1.題目鏈接2.算法原理詳解3.代碼實現 3.地下城游戲1.題目鏈接2.算法原理詳解3.代碼實現 1.下降路徑最小和 1.題目鏈接 下降路徑最小和 2.算法原理詳解 思路&#xff1a; 確定狀態表示 -> dp[i][j]的…

用WPS將多張圖片生成一個pdf文檔,注意參數設置

目錄 1 新建一個docx格式的文檔 2 向文檔中插入圖片 3 設置頁邊距 4 設置圖片大小 5 導出為pdf格式 需要把十幾張圖片合并為一個pdf文件&#xff0c;本以為很簡單&#xff0c;迅速從網上找到兩個號稱免費的在線工具&#xff0c;結果浪費了好幾分鐘時間&#xff0c;發現需要…

面試-軟件工程與設計模式相關,Spring簡介

面試-軟件工程與設計模式相關&#xff0c;Spring簡介 1.編程思想1.1 面向過程編程1.2 面向對象編程1.2.1 面向對象編程三大特征 1.3 面向切面編程1.3.1 原理1.3.2 大白話&#xff1f;1.3.3 名詞解釋1.3.4 實現 2. 耦合與內聚2.1 耦合性2.2 內聚性 3. 設計模式3.1 設計模型七大原…

【Nodejs-多進程之Cluster】

cluster 模塊是 Node.js 提供的一個用于多進程的模塊&#xff0c;它可以輕松地創建一組共享同一個服務器端口的子進程&#xff08;worker進程&#xff09;。通過使用 cluster 模塊&#xff0c;可以充分利用多核系統&#xff0c;提高應用程序的性能和可靠性。 基本原理 cluste…

#php把pdf文件轉成圖片#

本地環境 系統&#xff1a;win11 64位 環境&#xff1a;phpStudy PHP版本&#xff1a;8.0.2 礦建&#xff1a;laravel 配置擴展 一、安裝imageMagick 下載地址&#xff1a;https://imagemagick.org/script/download.php 安裝版本&#xff1a;ImageMagick-最新版本-Q16-HDRI-x64…

Docker: exec命令淺析

簡介 Docker exec命令是Docker提供的一個強大工具&#xff0c;用于在正在運行的容器中執行命令。在此將介紹Docker exec命令的用法和示例&#xff0c;幫助大家更好地理解和使用這個命令。 Docker是一種流行的容器化平臺&#xff0c;允許用戶在容器中運行應用程序。有時候&#…

React開發環境配置詳細講解-04

React環境 前端隨著規范化&#xff0c;可以說規范和環境插件配置滿天飛&#xff0c;筆者最早接觸的是jquery&#xff0c;那個開發非常簡單&#xff0c;只要引入jquery就可以了&#xff0c;當時還寫了一套UI框架&#xff0c;至今在做小型項目中還在使用&#xff0c;show一張效果…

一款顏值頗高的虛擬列表!差點就被埋沒了,終于還是被我挖出來了

大家好&#xff0c;我是曉衡&#xff01; 今天&#xff0c;推薦一款頗有顏值的虛擬列表組件&#xff0c;不然真的被埋沒就可惜了&#xff01; 我們先來看下效果&#xff1a; 感覺怎么樣&#xff1f;還不錯吧&#xff01; 為什么說這個資源差點被埋沒呢&#xff1f;因為個朋友找…

用數據,簡單點!奇點云2024 StartDT Day數智科技大會,直播見

在充滿挑戰的2024&#xff0c;企業如何以最小化的資源投入和試錯成本&#xff0c;挖掘新的增長機會&#xff0c;實現確定性發展&#xff1f; “簡單點”是當前商業環境的應對策略&#xff0c;也是奇點云2024 StartDT Day的核心理念。 5月28日&#xff0c;由奇點云主辦的2024 S…

Linux —— 信號量

Linux —— 信號量 什么是信號量P操作&#xff08;Wait操作&#xff09;V操作&#xff08;Signal操作&#xff09;信號量的類型 一些接口POSIX 信號量接口&#xff1a;其他相關命令&#xff1a; 基于循環隊列的生產者和消費者模型同步關系 多生產多消費 我們今天接著來學習信號…

【譯】組復制和 Percona XtraDB 集群: 常見操作概述

原文地址&#xff1a;Group Replication and Percona XtraDB Cluster: Overview of Common Operations 在這篇博文中&#xff0c;我將概述使用 MySQL Group Replication 8.0.19&#xff08;又稱 GR&#xff09;和 Percona XtraDB Cluster 8 (PXC)&#xff08;基于 Galera&…

Jetbrains插件AI Assistant,終于用上了

ai assistant激活成功后&#xff0c;如圖 ai assistant獲取&#xff1a;https://web.52shizhan.cn/activity/ai-assistant 主要功能如下

Spring Boot 配置使用 PEM 格式SSL/TLS證書和私鑰

傳統的為 Spring Boot 配置SSL/TLS證書一般都會把證書打包成 JKS(Java KeyStore) 或 PKCS12 (Public Key Cryptographic Standards) 格式&#xff0c;然后為Spring Boot 增加以下類似配置&#xff1a; # The format used for the keystore. It could be set to JKS in case it…

SpringBoot(六)之內嵌容器

SpringBoot&#xff08;六&#xff09;之內嵌容器 文章目錄 SpringBoot&#xff08;六&#xff09;之內嵌容器內嵌容器的特點如何替換默認容器1.pom形式2.主動配置 如何通過配置切換serlvet容器 Spring Boot 提供了一種便捷的方式來創建獨立運行的 Spring 應用程序&#xff0c;…

計算機畢業設計hadoop+spark微博輿情大數據分析 微博爬蟲可視化 微博數據分析 微博采集分析平臺 機器學習(大屏+LSTM情感分析+爬蟲)

電商數據建模 一、分析背景與目的 1.1 背景介紹 電商平臺數據分析是最為典型的一個數據分析賽道&#xff0c;且電商數據分析有著比較成熟的數據分析模型&#xff0c;比如&#xff1a;人貨場模型。此文中我將通過分析國內最大的電商平臺——淘寶的用戶行為&#xff0c;來鞏固數…

算法打卡 Day13(棧與隊列)-滑動窗口最大值 + 前 K 個高頻元素 + 總結

文章目錄 Leetcode 239-滑動窗口最大值題目描述解題思路 Leetcode 347-前 K 個高頻元素題目描述解題思路 棧與隊列總結 Leetcode 239-滑動窗口最大值 題目描述 https://leetcode.cn/problems/sliding-window-maximum/description/ 解題思路 在本題中我們使用自定義的單調隊列…