国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C語言】二分查找(含圖解)

這篇具有很好參考價(jià)值的文章主要介紹了【C語言】二分查找(含圖解)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 二分查找思想

二分法:二分查找算法是一種在有序數(shù)組中查找某一特定元素的搜索算法,其思想就是不斷地將有序查找表“一分為二”,逐漸縮小搜索區(qū)域,進(jìn)而找到目標(biāo)元素。

  • 搜素過程從數(shù)組的中間元素開始,如果中間元素正好是要查找的元素,則搜 素過程結(jié)束;
  • 如果某一特定元素大于或者小于中間元素,則在數(shù)組大于或小于中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。
  • 如果在某一步驟數(shù)組 為空,則代表找不到。
  • 這種搜索算法每一次比較都使搜索范圍縮小一半。折半搜索每次把搜索區(qū)域減少一半,時(shí)間復(fù)雜度為Ο(logn) 。

注:使用二分查找的前提條件是,數(shù)組已經(jīng)是有序的

二分查找圖解:以有序數(shù)組 {10, 14, 19, 26, 27, 31, 33, 35, 42, 44} 為例,查找元素 33。

初始狀態(tài):

二分查找c語言,C語言,c語言,二分法,二分查找,數(shù)據(jù)結(jié)構(gòu)

第一輪查找:根據(jù) 27<33,可以判定 33 位于 27 右側(cè)的區(qū)域,更新搜索區(qū)域?yàn)樵?27 右側(cè)的區(qū)域。

二分查找c語言,C語言,c語言,二分法,二分查找,數(shù)據(jù)結(jié)構(gòu)

二分查找c語言,C語言,c語言,二分法,二分查找,數(shù)據(jù)結(jié)構(gòu)

第二輪查找:35>33,可以判定 33 位于 35 左側(cè)的區(qū)域,更新搜索區(qū)域。

二分查找c語言,C語言,c語言,二分法,二分查找,數(shù)據(jù)結(jié)構(gòu)

二分查找c語言,C語言,c語言,二分法,二分查找,數(shù)據(jù)結(jié)構(gòu)

第三輪查找:31<33,可以判定 33 位于 31 右側(cè)的區(qū)域,更新搜索區(qū)域。

二分查找c語言,C語言,c語言,二分法,二分查找,數(shù)據(jù)結(jié)構(gòu)

二分查找c語言,C語言,c語言,二分法,二分查找,數(shù)據(jù)結(jié)構(gòu)

第四輪查找:搜索區(qū)域內(nèi)中間元素的位置是 [(7+7)/2]=7,因此中間元素是 33,此元素就是要找的目標(biāo)元素。

二分查找c語言,C語言,c語言,二分法,二分查找,數(shù)據(jù)結(jié)構(gòu)

2. 代碼實(shí)現(xiàn)

2.1 未封裝函數(shù)

代碼實(shí)現(xiàn)思路:

  • 定義low、high、mid,分別代表最小值、最大值和中間值的下標(biāo),并且初始賦值low指向第一個(gè)元素,high指向最后一個(gè)元素;定義target代表要查找的目標(biāo)值。
  • 進(jìn)行循環(huán)二分查找,循環(huán)的條件是左邊界還未超過右邊界(low <= high),當(dāng)左邊界超過右邊界,說明查找結(jié)束了。
  • 對(duì)比目標(biāo)值與中間值的大小,如果兩者相等說明查找到了(該值的下標(biāo)就是中間值的下標(biāo)mid);如果目標(biāo)值大于中間值,說明目標(biāo)值在左半邊,此時(shí)縮小右邊界的范圍 (high = mid - 1)重新查找;如果目標(biāo)值小于中間值,說明目標(biāo)值在右半邊,此時(shí)縮小左邊界的范圍 (low = mid + 1)重新查找。
#include <stdio.h>
#define N 11

int main() 
{
	int a[N] = {1, 5, 8, 11, 19, 22, 31, 35, 40, 49, 50}; // 準(zhǔn)備好一個(gè)已經(jīng)排序好的數(shù)組
	int low = 0, high = N - 1, mid, target; 
	printf("請(qǐng)輸入要查找的值:");
	scanf("%d", &target);
	printf("%d\n", target);
	
	// 當(dāng)左邊界還未超過右邊界時(shí),進(jìn)行二分查找
	while(low <= high)
	{
		mid = (low + high) / 2; // 每次循環(huán)重新給mid賦值,改變中間值的下標(biāo)
		printf("low = %d, high = %d, mid = %d\n", low, high, mid); // 此處打印各個(gè)下標(biāo)值,方便觀測(cè)下標(biāo)變化
		// 如果中間值等于目標(biāo)值,說明查找成功,此時(shí)跳出循環(huán)
		if(a[mid] == target){
			printf("目標(biāo)值的下標(biāo)是%d\n", mid);
			break;
		}
		// 如果中間值大于目標(biāo)值,說明目標(biāo)值在左半邊,此時(shí)改變右邊界的下標(biāo)(縮減右半邊)
		if(a[mid] > target)
			high = mid - 1;
		// 如果中間值小于目標(biāo)值,說明目標(biāo)值在右半邊,此時(shí)改變左邊界的下標(biāo)(縮減左半邊)
		if(a[mid] < target)
			low = mid + 1;
	}
	
	// 當(dāng)左邊界已經(jīng)超過右邊界時(shí),說明查找已經(jīng)結(jié)束
	if(low > high)
		printf("未找到目標(biāo)值\n");
	return 0;
}

注:以上代碼適用于數(shù)組已經(jīng)是升序排序的情況下。

運(yùn)行結(jié)果如下:

二分查找c語言,C語言,c語言,二分法,二分查找,數(shù)據(jù)結(jié)構(gòu)

二分查找c語言,C語言,c語言,二分法,二分查找,數(shù)據(jù)結(jié)構(gòu)

2.2 封裝函數(shù)(使用while循環(huán))

使用while循環(huán),將二分查找封裝成函數(shù),代碼如下:

#include <stdio.h>

// 二分查找,找到元素返回索引值,否則返回-1
int binarySearch(int arr[], int len, int target) {
	int low = 0, high = len -1, mid; // 最小值、最大值和中間值的下標(biāo)
	while(low <= high) {
		mid = (low + high) / 2; // 每次循環(huán)重新給mid賦值,改變中間值的下標(biāo)
		if(arr[mid] == target) { // 如果中間值等于目標(biāo)值,說明查找成功,返回下標(biāo)
			return mid;
		} else if(arr[mid] > target) { // 如果中間值大于目標(biāo)值,說明目標(biāo)值在左半邊,此時(shí)縮減右半邊
			high = mid -1;
		} else { // 如果中間值小于目標(biāo)值,說明目標(biāo)值在右半邊,此時(shí)縮減左半邊
			low = mid + 1;
		}
	}
	return -1;
}

int main() {
	int a[] = {1, 5, 8, 11, 19, 22, 31, 35, 40, 49, 50}; 
	int len = sizeof(a) / sizeof(int);
	int index, target;
	printf("請(qǐng)輸入要查找的值:");
	scanf("%d", &target);
	index = binarySearch(a, len, target);
	printf("目標(biāo)值的下標(biāo)是%d\n", index);
	return 0;
}

運(yùn)行結(jié)果如下:

二分查找c語言,C語言,c語言,二分法,二分查找,數(shù)據(jù)結(jié)構(gòu)

二分查找c語言,C語言,c語言,二分法,二分查找,數(shù)據(jù)結(jié)構(gòu)

2.3 封裝函數(shù)(使用遞歸)

使用遞歸調(diào)用,將二分查找封裝成函數(shù),代碼如下:

#include <stdio.h>

// 二分查找,找到元素返回索引值,否則返回-1
int binarySearch(int arr[], int low, int high, int target) {
	if(low <= high) {
		int mid = (low + high) / 2; // 每次遞歸重新給mid賦值,改變中間值的下標(biāo)
		if(arr[mid] == target) { // 如果中間值等于目標(biāo)值,說明查找成功,返回下標(biāo)
			return mid;
		} else if(arr[mid] > target) { // 如果中間值大于目標(biāo)值,說明目標(biāo)值在左半邊
			high = mid -1;
			return binarySearch(arr, low , high, target); // 繼續(xù)查找左半邊
		} else { // 如果中間值小于目標(biāo)值,說明目標(biāo)值在右半邊
			low = mid + 1;
			return binarySearch(arr, low , high, target); // 繼續(xù)查找右半邊
		}
	} else {
		return -1;
	}
}

int main() {
	int a[] = {1, 5, 8, 11, 19, 22, 31, 35, 40, 49, 50}; 
	int len = sizeof(a) / sizeof(int);
	int index, target;
	printf("請(qǐng)輸入要查找的值:");
	scanf("%d", &target);
	index = binarySearch(a, 0, len-1, target);
	printf("目標(biāo)值的下標(biāo)是%d\n", index);
	return 0;
}

注:使用遞歸查找,值得注意的是,每次遞歸時(shí),需要縮小查找的范圍,也就是每次傳入的左右邊界發(fā)生了改變,因此入?yún)⒈赜?lowhigh,所以此處遞歸函數(shù)的定義是 binarySearch(int arr[], int low, int high, int target),而不能像之前封裝while循環(huán)的函數(shù)定義 binarySearch(int arr[], int len, int target)文章來源地址http://www.zghlxwxcb.cn/news/detail-728620.html

到了這里,關(guān)于【C語言】二分查找(含圖解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 初階算法(3):二分法的講解與實(shí)現(xiàn)(C語言),以及二分不止光在有序數(shù)組中的應(yīng)用

    ?第一章?初階算法(1):通過簡(jiǎn)單的排序算法來認(rèn)識(shí)時(shí)間復(fù)雜度 ?第二章?初階算法(2):進(jìn)行詳細(xì)地介紹插入排序的細(xì)節(jié)和時(shí)間復(fù)雜度 ?第三章 初階算法(3):二分法的講解與實(shí)現(xiàn),以及二分不止光在有序數(shù)組中的應(yīng)用 目錄 系列文章目錄 前言 一、二分法的講解與實(shí)現(xiàn)

    2024年02月14日
    瀏覽(24)
  • 二分法簡(jiǎn)單題

    2024年01月24日
    瀏覽(27)
  • 二分法相關(guān)使用

    二分法相關(guān)使用

    在線OJ:704. 二分查找 有序數(shù)組下的二分思路如下: 由于這里是有序數(shù)組, 我們可以可以先得到中點(diǎn)位置, 中點(diǎn)可以把數(shù)組分為左右兩邊; 如果中點(diǎn)位置的值等于目標(biāo)值, 直接返回中點(diǎn)位置; 如果中點(diǎn)位置的值小于目標(biāo)值, 則去數(shù)組中點(diǎn)左側(cè)按同樣的方式查找; 如果中點(diǎn)位置的值大

    2024年02月07日
    瀏覽(17)
  • 二分法MATLAB代碼

    二分法MATLAB代碼

    本質(zhì)是通過不斷進(jìn)行區(qū)間壓縮來獲取函數(shù)零點(diǎn)。 二分法的終止條件:區(qū)間長(zhǎng)度小于等于精度要求 。 流程: 如下圖所示:

    2024年02月05日
    瀏覽(25)
  • 初探二分法

    初探二分法

    智能化校園:深入探討云端管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)(一) 智能化校園:深入探討云端管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)(二) 題目:給定一個(gè) n 個(gè)元素有序的(升序)整型數(shù)組 nums 和一個(gè)目標(biāo)值 target ,寫一個(gè)函數(shù)搜索 nums 中的 target,如果目標(biāo)值存在返回下標(biāo),否則返回 -1。 提示: 你可以

    2024年01月25日
    瀏覽(23)
  • 【算法】—二分法詳解

    【算法】—二分法詳解

    ①定義: 二分查找算法也稱折半搜索算法,對(duì)數(shù)搜索算法,是一種在 有序數(shù)組 中查找某一特定元素的搜索算法。搜索過程從數(shù)組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結(jié)束;如果某一特定元素大于或者小于中間元素,則在數(shù)組大于或小于中間元素

    2024年02月09日
    瀏覽(25)
  • 牛頓法、割線法、二分法

    牛頓法、割線法、二分法

    牛頓法求解非線性方程組 割線法求解非線性方程組 二分法求解根號(hào)3 ?另外,今天上機(jī)課寫程序時(shí),發(fā)現(xiàn)不同的起始點(diǎn)可以收斂到不同的零點(diǎn)。也許這是一個(gè)新的值得研究的地方。 看來,計(jì)算數(shù)學(xué)也是這樣,光聽理論無法實(shí)現(xiàn)大的突破,也沒法產(chǎn)生好的想法,必須在實(shí)踐應(yīng)用

    2024年02月05日
    瀏覽(25)
  • 【劍指Offer】二分法例題

    【劍指Offer】二分法例題

    鏈表是數(shù)據(jù)結(jié)構(gòu)中重要的一個(gè)章節(jié),他的重要性也不言而喻,在未來不管是筆試還是面試都會(huì)遇到這類的題目,所以接下來我就會(huì)把一些鏈表的??嫉念}目全部整理出來供大家學(xué)習(xí)指正。 題目鏈接 描述: 給定一個(gè)長(zhǎng)度為n的數(shù)組nums,請(qǐng)你找到峰值并返回其索引。數(shù)組可能包

    2023年04月13日
    瀏覽(20)
  • 非線性方程二分法

    優(yōu)點(diǎn):算法直觀、簡(jiǎn)單、總能保證收斂;局限:收斂速度慢、一般不單獨(dú)用它求根,僅為了獲取根的粗略近似 設(shè) f ( x ) f(x) f ( x ) 在 [ a , b ] [a,b] [ a , b ] 上連續(xù)、嚴(yán)格單調(diào)、滿足條件 f ( a ) f ( b ) 0 f(a)f(b)0 f ( a ) f ( b ) 0 則在區(qū)間 [ a , b ] [a,b] [ a , b ] 內(nèi)必有一根 x ? x^* x ? 。通

    2024年02月04日
    瀏覽(28)
  • 1241:二分法求函數(shù)的零點(diǎn)

    【題目描述】 有函數(shù):f(x)=x5?15x4+85x3?225x2+274x?121 已知f(1.5)0,f(2.4)0 且方程f(x)=0在區(qū)間[1.5,2.41.5,2.4] 有且只有一個(gè)根,請(qǐng)用二分法求出該根。 【輸入】 (無) 【輸出】 該方程在區(qū)間[1.5,2.41.5,2.4]中的根。要求四舍五入到小數(shù)點(diǎn)后66位。 【輸入樣例】 【輸出樣例】 【AC代碼】

    2024年01月25日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包