亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言算法練習(xí)之折半查找的實(shí)現(xiàn)

 更新時(shí)間:2022年05月05日 09:45:56   作者:飛向星的客機(jī)  
二分查找法(也叫折半查找)其本質(zhì)是分治算法的一種。這篇文章主要介紹了如何利用C語言實(shí)現(xiàn)折半查找,感興趣的小伙伴可以學(xué)習(xí)一下

1. 題目描述

N 個(gè)有序整數(shù)數(shù)列已放在一維數(shù)組中,利用二分查找法查找整數(shù) m 在數(shù)組中的位置。

若找到,則輸出其下標(biāo)值;反之,則輸出 “ Not be found!”。

2. 問題分析

二分查找法(也叫折半查找)其本質(zhì)是分治算法的一種。

所謂分治算法是指的分而治之,即將較大規(guī)模的問題分解成幾個(gè)較小規(guī)模的問題,這些子問題互相獨(dú)立且與原問題相同,通過對(duì)較小規(guī)模問題的求解達(dá)到對(duì)整個(gè)問題的求解。

我們把將問題分解成兩個(gè)較小問題求解的分治方法稱為二分法。需要注意的是,二分查找法只適用于有序序列。

二分查找的基本思想是:每次查找前先確定數(shù)組中待查的范圍,假設(shè)指針 low 和 high (low<high) 分別指示待查范圍的 下界 和 上界,指針 mid 指示區(qū)間的 中間位置,即 mid=(low+high)/2,把 m 與 中間位置 (mid) 中元素的值進(jìn)行比較。

如果m的值大于中間位置元素中的值,則下一次的查找范圍放在中間位置之后的元素中;

反之,下一次的查找范圍放在中間位置之前的元素中。直到 low>high,查找結(jié)束。

3. 算法設(shè)計(jì)

N 個(gè)有序數(shù)應(yīng)存放在數(shù)組中,根據(jù)數(shù)組下標(biāo)的取值范圍知指針 low 和 high 的初值分別為 0、N-1。

除了三個(gè)指針變量 low、high、mid 之外還需要一個(gè)變量(假設(shè)為 k)來 記錄下標(biāo),利用變量 k 的值來 判斷整數(shù)是否在所給出的數(shù)組中。下面我們用示意圖來表示二分查找的過程。

假設(shè)一維數(shù)組中存儲(chǔ)的有序數(shù)列為:5 13 19 21 37 56 64 75 80 88 92,要查找的整數(shù) m 為 21。

根據(jù)二分查找方法可知指針 low 和 high 最初分別指向元素 5 和 92,由 mid=(low+high)/2 知,指針 mid 指向元素 56。示意圖如下:

變量 m 所代表的整數(shù) 21 與 指針 mid 所指的元素 56 進(jìn)行比較, 21 小于 56, 根據(jù)二分查找算法知, 查找范圍現(xiàn)在縮小到指針 mid 所指元素的前面, 即從 5~37 的范圍。

指針 high 原來指向下標(biāo)為 N-1 的元素,現(xiàn)在指向下標(biāo)為 mid-1 的元素,接著重新計(jì)算指針 mid 所指元素的下標(biāo)。

再次進(jìn)行比較,21 大于 19,現(xiàn)在比較范圍再次轉(zhuǎn)移到 mid 所指元素的后面,low 元素所指元素下標(biāo)由 0 變?yōu)?mid+1。

當(dāng)前 mid 所指元素的值為 21,與要查找的整數(shù)值相同,因此查找成功,所查元素在表中序號(hào)等于指針 mid 的值。

4. 動(dòng)圖演示

動(dòng)圖解析

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

流程圖設(shè)計(jì)

完整代碼

#include <stdio.h>
#define N 10

int main()
{
	int a[N] = { -3,4,7,9,13,45,67,89,100,180 }; 
	int low = 0; 
	int high = N - 1; 
	int mid; 
	int i;
	int m; 
	int k = -1;

	printf("a 數(shù)組中的數(shù)據(jù)如下:");
	for (i = 0; i < N; i++)
	{
		printf("%d ", a[i]); 
	}

	printf("\n");

	printf("Enter m:");
	scanf("%d", &m); 

	while (low <= high) 
	{
		mid = (low + high) / 2; 

		if (m < a[mid])
		{
			high = mid - 1;
		}
		else
		{
			if (m > a[mid])
			{
				low = mid + 1;
			}
			else
			{
				k = mid;
				break; 
			}
		}
	}
	if (k >= 0)
		printf("m=%d index=%d\n", m, k);
	else
		printf("Not be found!\n");
}

運(yùn)行結(jié)果

代碼貼圖

程序分析

在上述程序中循環(huán)結(jié)束可以有兩種情況。

一種是由于循環(huán)的判定條件 low <= high 不成立的情況下跳出循環(huán),此時(shí)可知查找不成功。

在查找不成功的情況下,語句 else {k=mid; break;} 是不執(zhí)行的,所以變量 k 的值不變?nèi)詾槌踔?-1。

第二種結(jié)束循環(huán)的情況是由于執(zhí)行了 break; 語句而跳出循環(huán),在此情況下,變量 k 的值由 -1 變成了一個(gè)大于等于 0 的數(shù),即指針 mid 所指元素的下標(biāo)值。

所以在最后用選擇結(jié)構(gòu)來判定 k 的值,從而確定整個(gè)查找過程是否成功。

6.知識(shí)點(diǎn)補(bǔ)充

continue 語句

continue 語句的格式為:

continue;

continue 語句用于循環(huán)語句(while循環(huán)語句 或 do...while循環(huán)語句 或 for循環(huán)語句)中,作為循環(huán)體的一部分。

在程序執(zhí)行時(shí),一旦遇到了 continue 語句,則立即結(jié)束本次循環(huán),即跳過循環(huán)體中 continue 后面尚未執(zhí)行的語句,接著進(jìn)行是否繼續(xù)循環(huán)的條件判定。

break 語句

break 語句的格式如下:

break;

break 語句 可用在 switch 語句中。

在程序執(zhí)行時(shí), 一旦遇到了 break 語句, 則立即退出當(dāng)前的 switch 語句。

除此之外, break 語句還能用于循環(huán)語句(while循環(huán)語句 或 do...while 循環(huán)語句 或 for 循環(huán)語句))中, 作為循環(huán)體的一部分。

在程序執(zhí)行時(shí), 一旦遇到了 break語句, 則立即退出當(dāng)前的循環(huán)體,接著執(zhí)行當(dāng)前循環(huán)體下面的語句。

continue語句 和 break語句的區(qū)別

continue 只是結(jié)束本次循環(huán),不再執(zhí)行循環(huán)體中 continue 后面的其余語句,并不是終止當(dāng)前循環(huán)。

break 是直接終止當(dāng)前的循環(huán)。

7. 問題拓展

在一個(gè)給定的數(shù)據(jù)結(jié)構(gòu)中查找某個(gè)指定的元素,通常根據(jù)不同的數(shù)據(jù)結(jié)構(gòu),應(yīng)采用不同的查找方法。對(duì)于一個(gè)有序數(shù)列,除了采用二分查找法之外還可以采用 順序查找 的方法。

順序查找一般是指 在線性表中查找指定的元素,其基本方法如下:

從線性表的第一個(gè)元素開始,依次將線性表的元素與被查元素進(jìn)行比較,若相等則表示找到即查找成功;

若線性表中所有的元素都與被查元素進(jìn)行了比較但都不相等,則表示線性表中沒有要找的元素即查找失敗。

在長(zhǎng)度為 n 的線性表中查找指定元素,最好的情況是比較一次成功,最壞的情況是比較 n 次,平均要比較(1+2+3+⋅⋅⋅+n)/n=(1+n)/2 次。

盡管順序查找的效率低,但對(duì)于一些情況只能采用順序查找的方法,如對(duì)于一個(gè)無序表進(jìn)行查找。

完整代碼

#include <stdio.h>
#define N 10

int main()
{
	int a[N] = { -3,4,7,9,13,45,67,89,100,180 }, i, m, k = -1;
	printf("a數(shù)組中的數(shù)據(jù)如下: ");
	for (i = 0; i < N; i++)
	{
		printf("%d ", a[i]); //輸出數(shù)組中原數(shù)據(jù)序列
	}

	printf("\n");

	printf("Enter m: ");
	scanf("%d", &m); //由鍵盤輸入要查找的整數(shù)值

	for (i = 0; i < N; i++)
	{
		if (m == a[i])
		{
			k = i;
			break; //一旦找到所要查找的元素便跳出循環(huán)
		}
	}

	if (k >= 0)
		printf("%m=%d index=%d\n", m, k);
	else
		printf("Not be found!\n");

	return 0;
}

運(yùn)行結(jié)果

到此這篇關(guān)于C語言算法練習(xí)之折半查找的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語言折半查找內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++類中六個(gè)默認(rèn)的成員函數(shù)詳解

    C++類中六個(gè)默認(rèn)的成員函數(shù)詳解

    這篇文章主要給大家介紹了關(guān)于C++類中六個(gè)默認(rèn)的成員函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C/C++百行代碼實(shí)現(xiàn)熱門游戲消消樂功能的示例代碼

    C/C++百行代碼實(shí)現(xiàn)熱門游戲消消樂功能的示例代碼

    這篇文章主要介紹了C/C++百行代碼實(shí)現(xiàn)熱門游戲消消樂功能的示例代碼,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • C語言編程中借助pthreads庫(kù)進(jìn)行多線程編程的示例

    C語言編程中借助pthreads庫(kù)進(jìn)行多線程編程的示例

    這篇文章主要介紹了C語言編程中借助pthreads庫(kù)進(jìn)行多線程編程的示例,文中的示例環(huán)境為Windows系統(tǒng),需要的朋友可以參考下
    2015-11-11
  • 深度解析三個(gè)常見的C語言內(nèi)存函數(shù)

    深度解析三個(gè)常見的C語言內(nèi)存函數(shù)

    這篇文章主要深度解析了三個(gè)常見的C語言內(nèi)存函數(shù)memcpy,memmove,memcmp,所以本文將對(duì)memcpy,memmove,memcmp 三個(gè)函數(shù)進(jìn)行詳解和模擬實(shí)現(xiàn),需要的朋友可以參考下
    2023-07-07
  • Ubuntu18.04上安裝Qt5.10的步驟實(shí)踐

    Ubuntu18.04上安裝Qt5.10的步驟實(shí)踐

    Qt是一個(gè)跨平臺(tái)的C++圖形用戶界面庫(kù),本文就介紹了Ubuntu18.04上安裝Qt5.10的步驟實(shí)踐,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++多線程之帶返回值的線程處理函數(shù)解讀

    C++多線程之帶返回值的線程處理函數(shù)解讀

    這篇文章主要介紹了C++多線程之帶返回值的線程處理函數(shù)解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++實(shí)現(xiàn)景區(qū)旅游信息管理系統(tǒng)

    C++實(shí)現(xiàn)景區(qū)旅游信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)景區(qū)旅游信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++日志記錄類實(shí)例解析

    C++日志記錄類實(shí)例解析

    這篇文章主要介紹了C++日志記錄類實(shí)例,代碼功能非常實(shí)用,需要的朋友可以參考下
    2014-07-07
  • C語言自定義類型超詳細(xì)梳理之結(jié)構(gòu)體 枚舉 聯(lián)合體

    C語言自定義類型超詳細(xì)梳理之結(jié)構(gòu)體 枚舉 聯(lián)合體

    今天我們來學(xué)習(xí)一下自定義類型,自定義類型包括結(jié)構(gòu)體、枚舉、聯(lián)合體,小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考
    2022-03-03
  • C語言編程數(shù)據(jù)結(jié)構(gòu)棧與隊(duì)列的全面講解示例教程

    C語言編程數(shù)據(jù)結(jié)構(gòu)棧與隊(duì)列的全面講解示例教程

    本文介紹著重介紹數(shù)據(jù)結(jié)構(gòu)-棧和隊(duì)列的知識(shí),由于本文也設(shè)計(jì)多個(gè)動(dòng)態(tài)內(nèi)存開辟函數(shù),小伙伴們?cè)趯W(xué)習(xí)本文之前,一定一定一定要把動(dòng)態(tài)內(nèi)存開辟相關(guān)知識(shí)掌握牢固,這樣學(xué)習(xí)起本文才能事半功倍
    2021-10-10

最新評(píng)論