最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言折半查找法的由來(lái)及使用詳解

 更新時(shí)間:2022年08月18日 11:14:44   作者:Zoroxs  
折半查找法也叫做?分查找,顧名思義就是把數(shù)據(jù)分成兩半,再判斷所查找的key在哪?半中,再重復(fù)上述步驟知道找到?標(biāo)key,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言折半查找法的相關(guān)資料,需要的朋友可以參考下

引入二分查找

本文帶著大家學(xué)習(xí)一個(gè)簡(jiǎn)單的**二分查找算法,也叫折半查找算法**

先給大家提出一個(gè)問(wèn)題

額,大家應(yīng)該都會(huì)碰到這種情況,那大家怎么猜呢?

我想一定是會(huì)說(shuō)1000,他說(shuō)太少了,你又猜1500…

這其實(shí)就是二分查找的應(yīng)用。

接下來(lái)我們來(lái)看一個(gè)問(wèn)題

如何在一個(gè)有序數(shù)組中查找一個(gè)數(shù)字?

有一部分帥氣的觀眾可能會(huì)說(shuō):

直接遍歷數(shù)組,一個(gè)一個(gè)對(duì)比就找到了啊

但是大家有沒(méi)有想過(guò)一個(gè)問(wèn)題,數(shù)組中如果只有幾十個(gè)數(shù)的話,那完全可以這樣做

那如果數(shù)組中有幾十萬(wàn)個(gè)呢?

這樣遍歷絕對(duì)是非常消耗時(shí)間,題目很明確說(shuō)有序數(shù)組,如果直接遍歷,我們是不是對(duì)不起有序這二字呢?

分析二分查找

我們用一個(gè)簡(jiǎn)單的實(shí)例來(lái)實(shí)現(xiàn)一下二分查找

比如有這樣一個(gè)數(shù)組

計(jì)算中間下標(biāo)的兩種方法

我們?cè)谄渲胁檎乙粋€(gè)數(shù)字。使用二分查找,我們?nèi)绾未_定中間值呢?

有人說(shuō),數(shù)組長(zhǎng)度除以二,但是中間值會(huì)變,數(shù)組長(zhǎng)度不可變 ----排除

這邊我們給大家?guī)?lái)兩種方法來(lái)計(jì)算中間值

首先大家要清楚,我們要有兩個(gè)邊界,就是范圍,比如鞋子02000變成10002000

我們使用兩個(gè)下標(biāo)作為兩端,left 以及 right 中間值我們定義為mid

第一種

mid = (left + right) / 2;

我對(duì)長(zhǎng)度為奇數(shù)和偶數(shù)的數(shù)組都進(jìn)行了分析,這種方法并沒(méi)有漏過(guò)任何一個(gè)數(shù),所以可以使用

第二種

第一種方法有一種弊病,如果數(shù)組特別長(zhǎng)的話,left+right可能會(huì)超出類型的最大值范圍

我們得想辦法解決掉這個(gè)問(wèn)題

假如我們把left最上邊那一小塊放到left上邊,是不是就是中間值了呢

把這種方法寫(xiě)成表達(dá)式就是

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

這就是兩種計(jì)算中間下標(biāo)的方法

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

  • 當(dāng)mid處的值 < 待查找的值的時(shí)候 ,需要把 mid處的以及前邊的舍棄,即left右移, left = mid +1;
  • 當(dāng)mid處的值 > 待查找的值的時(shí)候 ,需要把 mid處的以及后邊的舍棄,即right左移,right = mid -1;
  • 當(dāng)相等時(shí),便不再查找。

還有一個(gè)問(wèn)題,什么時(shí)候就不再查找了呢?

  • left < right 時(shí),中間仍有數(shù)據(jù)未查找
  • left = right 時(shí),有一個(gè)數(shù)未比較
  • left>right 時(shí),都找完了,沒(méi)找到

所以當(dāng)left > right 時(shí),就沒(méi)必要查找了

話不多說(shuō),直接上代碼

#include <stdio.h>
//詳解二分查找
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//計(jì)算數(shù)組長(zhǎng)度
	int length = sizeof(arr) / sizeof(arr[0]);
	int n = 0;//待查找的值
	scanf("%d", &n);
	int left = 0;//左下標(biāo)
	int right = length - 1;//右下標(biāo)
	int mid = 0;//中間下標(biāo)
	while(left <= right)
	{
		mid = (left + right) / 2;
		if(arr[mid] > n)
		{
			right = mid - 1;
		}
		else if (arr[mid] < n)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,下標(biāo)為%d\n", mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到,數(shù)組中不存在該值\n");
	}
	return 0;
}

總結(jié)

理解二分查找法的實(shí)現(xiàn)方式

核心在于中間下標(biāo)的控制以及下標(biāo)的變化

大家下來(lái)一定要自己畫(huà)圖理解,寫(xiě)代碼測(cè)試,多寫(xiě)寫(xiě)就悟了。

到此這篇關(guān)于C語(yǔ)言折半查找法的由來(lái)及使用詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言折半查找內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)化的實(shí)現(xiàn)

    C++ 數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)化的實(shí)現(xiàn)

    這篇文章主要介紹了C++ 數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • FFmpeg實(shí)戰(zhàn)之利用ffplay實(shí)現(xiàn)自定義輸入流播放

    FFmpeg實(shí)戰(zhàn)之利用ffplay實(shí)現(xiàn)自定義輸入流播放

    ffplay是FFmpeg提供的一個(gè)極為簡(jiǎn)單的音視頻媒體播放器,可以用于音視頻播放、可視化分析。本文將利用ffplay實(shí)現(xiàn)自定義輸入流播放,需要的可以參考一下
    2022-12-12
  • VC6.0常用快捷鍵大全

    VC6.0常用快捷鍵大全

    這篇文章主要介紹了VC6.0常用快捷鍵大全,非常實(shí)用,需要的朋友可以參考下
    2014-08-08
  • vscode分享代碼插件Polacode介紹

    vscode分享代碼插件Polacode介紹

    這篇文章主要介紹了vscode分享代碼插件Polacode的相關(guān)知識(shí),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • QT實(shí)現(xiàn)二、八、十六進(jìn)制之間的轉(zhuǎn)換

    QT實(shí)現(xiàn)二、八、十六進(jìn)制之間的轉(zhuǎn)換

    本文主要介紹了QT實(shí)現(xiàn)二、八、十六進(jìn)制之間的轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • OpenCV 視頻中火焰檢測(cè)識(shí)別實(shí)踐

    OpenCV 視頻中火焰檢測(cè)識(shí)別實(shí)踐

    本文主要介紹了OpenCV 視頻中火焰檢測(cè)識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Visual Studio 2022卡死分析

    Visual Studio 2022卡死分析

    本文主要介紹了Visual Studio 2022卡死分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C語(yǔ)言遞歸實(shí)現(xiàn)線索二叉樹(shù)

    C語(yǔ)言遞歸實(shí)現(xiàn)線索二叉樹(shù)

    這篇文章主要介紹了C語(yǔ)言遞歸實(shí)現(xiàn)線索二叉樹(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C++中std::count函數(shù)介紹和使用場(chǎng)景

    C++中std::count函數(shù)介紹和使用場(chǎng)景

    std::count函數(shù)是一個(gè)非常實(shí)用的算法,它可以幫助我們快速統(tǒng)計(jì)給定值在指定范圍內(nèi)的出現(xiàn)次數(shù),本文主要介紹了C++中std::count函數(shù)介紹和使用場(chǎng)景,感興趣的可以了解一下
    2024-02-02
  • C++實(shí)現(xiàn)CreatThread函數(shù)主線程與工作線程交互的方法

    C++實(shí)現(xiàn)CreatThread函數(shù)主線程與工作線程交互的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)CreatThread函數(shù)主線程與工作線程交互的方法,是Windows應(yīng)用程序設(shè)計(jì)中非常實(shí)用的方法,需要的朋友可以參考下
    2014-10-10

最新評(píng)論

寿光市| 闽侯县| 宣武区| 揭西县| 绥化市| 盐城市| 岳阳县| 涪陵区| 娄底市| 化州市| 安泽县| 安平县| 庆城县| 抚远县| 襄樊市| 九龙县| 黄骅市| 依安县| 太康县| 象州县| 尉氏县| 龙江县| 永平县| 大悟县| 清流县| 麻江县| 陆川县| 宿迁市| 扬州市| 开原市| 弥勒县| 东平县| 邢台市| 德庆县| 孟连| 桐梓县| 东兴市| 屯昌县| 昔阳县| 富蕴县| 汉寿县|