一篇文章帶你了解C語(yǔ)言二分查找
我們常常需要對(duì)數(shù)據(jù)進(jìn)行查找,修改,查找數(shù)據(jù)有許多方法,我們先看看最簡(jiǎn)單的順序查找
int main()
{
int i, k = 0;
scanf("%d", &k);
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
if (arr[i] == k)
{
printf("找到了,它是%d", arr[i]);
}
}
return 0;
}
順序查找絕大多數(shù)情況有效但是由于它是一個(gè)一個(gè)元素進(jìn)行查找,其效率很低,只有一個(gè)for循環(huán)所有其時(shí)間復(fù)雜度為O(n)。我們希望有一個(gè)更高效的查找方法,接下來(lái)便是二分查找,先來(lái)看看一個(gè)順序查找和二分查找的直觀比較。

從上面的圖中我們感受到二分查找的關(guān)鍵:找到最左邊元素(low)和最右邊元素(high),確定中間元素(mid),比較中間元素(mid)和目標(biāo)元素(k)的大小,調(diào)整low和high,再確定新的mid....我們要不斷確定mid直到找到k,自然需要用到循環(huán),我們有明確的目標(biāo):找到k。因此選擇while循環(huán),找到k后循環(huán)不再進(jìn)行,而當(dāng)low和high之間還有元素,即low在high的左邊或與之重合,k就依然可能存在,所以循環(huán)條件為low<=high,接下來(lái)的問(wèn)題在于怎樣調(diào)整low和high的值,mid和k比較無(wú)非就三種情況:mid<k,mid>k,mid=k。第一種情況,k在mid的右邊,我們將low調(diào)整為mid+1,high不用調(diào)整;第二種情況,k在mid的左邊,我們將high調(diào)整為mid-1,low不用調(diào)整。最后一種情況最簡(jiǎn)單,我們已經(jīng)找到了k,直接將mid打印出來(lái)就行了,代碼如下:
#include <stdio.h>
int main()
{
int k = 0;
scanf("%d", &k);
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sz = sizeof(arr) / sizeof (arr[0]);
int low = 0;
int high = sz-1;
while (low <= high)
{
int mid = (low + high) / 2;
if (arr[mid] > k)
{
high = mid - 1;
}
else if (arr[mid] < k)
{
low = mid + 1;
}
else
{
printf("找到了,它是:%d", arr[a]);
break;
}
}
if (l>r)
printf("沒(méi)找到,請(qǐng)重新輸入");
return 0;
}
二分查找的時(shí)間復(fù)雜度的問(wèn)題:總共有n個(gè)元素,每次查找的區(qū)間大小就是n,n/2,n/4,…,n/2^k(接下來(lái)操作元素的剩余個(gè)數(shù)),其中k就是循環(huán)的次數(shù)。由于n/2^k取整后>=1,即令n/2^k=1,可得k=log2n,(是以2為底,n的對(duì)數(shù)),所以時(shí)間復(fù)雜度可以表示O(logn),確實(shí)比順序查找快不少,但是二分查找有一個(gè)較大的局限性:只能查找有序數(shù)組的元素,即組數(shù)字必須是升序或降序。
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語(yǔ)言?棧與數(shù)組的實(shí)現(xiàn)詳解
棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱為棧頂,相對(duì)地,把另一端稱為棧底。向一個(gè)棧插入新元素又稱作進(jìn)棧、入?;驂簵#前研略胤诺綏m斣氐纳厦?,使之成為新的棧頂元素2022-04-04
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易文本編譯器
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易文本編譯器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
C++深入分析講解函數(shù)與重載知識(shí)點(diǎn)
C++?允許多個(gè)函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載(Function?Overloading),借助重載,一個(gè)函數(shù)名可以有多種用途2022-06-06
C語(yǔ)言例題之輸出1000以內(nèi)的所有完數(shù)
完數(shù)是一些特殊的自然數(shù),它所有的真因子(即除了自身以外的約數(shù))的和(即因子函數(shù)),恰好等于它本身,如果一個(gè)數(shù)恰好等于它的因子之和,則稱該數(shù)為“完數(shù)”,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言例題之輸出1000以內(nèi)的所有完數(shù)的相關(guān)資料,需要的朋友可以參考下2022-11-11

