二分查找的前提:
一個整形有序數(shù)組中查找具體某個數(shù)
以下以數(shù)組元素為偶數(shù)個做例
??二分查找(折半查找)的思想:對于已按關(guān)鍵字排序的序列,經(jīng)過一次比較,可將序列分割成兩部分,然后只在有可能包含待查元素的一部分中繼續(xù)查找,并根據(jù)試探結(jié)果繼續(xù)分割,逐步縮小查找范圍,直至找到或找不到為止。
?下圖為程序在數(shù)組中尋找整數(shù)6的過程?
進入循環(huán)之前,先定義數(shù)組的左右下標:左下標為0,右下標為數(shù)組元素個數(shù)減去1
??while (left <= right),當作下標小于右下標時,進入循環(huán)
第一次循環(huán):
if 和else? if語句內(nèi)均沒有break 語句,所以循環(huán)繼續(xù)
第二次循環(huán):
?第三次循環(huán):
?
跳出循環(huán)后判斷right的關(guān)系,這個if語句是在沒有找到的情況下進入?文章來源:http://www.zghlxwxcb.cn/news/detail-507041.html
?代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-507041.html
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//已知的整形有序數(shù)組
int x = 0;//x是要尋找的數(shù)
int left = 0;//左下標
int right = sizeof(arr) / sizeof(arr[0]) - 1;//數(shù)組右下標
scanf("%d", &x);
while (left <= right)
{
int mid = left+(right-left)/2;//找到最中間的數(shù)
if (x < arr[mid])
{
right = mid-1;
}
else if (x > arr[mid])
{
left = mid+1;
}
else
{
printf("找到了,下標是%d\n", mid);
break;
}
}
if (right < left)
{
printf("沒找到");
}
return 0;
}
除了給定整形有序數(shù)組外,我們還可以自己輸入一個有序數(shù)組和需要查找的數(shù)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[100];
int j = 0;//j為需要尋找的數(shù)
int i = 0;
int left = 0;
int right = 0;
while (1)
{
scanf("%d", &arr[i]);
i++;
if (getchar() == '\n')
{
break;//遇到回車則證明數(shù)組輸入結(jié)束
}
}
scanf("%d", &j);
right = i - 1;//總共輸入了i個元素,最大下標為i-1
while (left <= right)
{
int mid = left + (right - left) / 2;
if (j < arr[mid])
{
right = mid - 1;
}
else if (j > arr[mid])
{
left = mid + 1;
}
else
{
printf("找到了,下標為%d\n", mid);
break;
}
}
//左右下標發(fā)生交叉的情況,則證明沒有找到
if (left > right)
{
printf("沒找到\n");
}
return 0;
}
到了這里,關(guān)于二分查找(C語言實現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!