有15個數按由大到小順序存放在一個數組中,輸入一個數,要求用折半查找法找出該數是數組中第幾個元素的值。如果該數不在數組中,則輸出"無此數"。
【答案解析】
二分查找是一個非常高效簡單的查找算法,筆試和面試中非常喜歡考察。
折半查找又叫二分查找,查找的前提是序列中元素必須有序,假設區間使用[left, right)標記,待查找元素為key,具體查找的方式如下:當區間[left, right)有效時循環進行一下操作
- 找到[left, right)區間中間位置
- 如果key等於中間位置元素,則找到,返回該元素在數組中的下標
- 如果key小於中間位置元素,到數組的左半側繼續二分查找
- 如果key大於中間位置元素,到數組的右半側繼續二分查找
如果循環結束時還沒有找到,則不存在該元素。
【代碼實現】
#include<stdio.h>
int main()
{
int array[15] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
int left = 0;
int right = sizeof(array) / sizeof(array[0]);
int key = 0;
printf("請輸入要查找的數字: ");
scanf("%d", &key);
// 二分查找
while (left < right)
{
// 找到中間位置
int mid = left + ((right - left) >> 1);
if (key == array[mid])
{
printf("%d\n", mid);
break;
}
else if (key < array[mid])
{
right = mid;
}
else
{
left = mid + 1;
}
}
if (left >= right)
printf("無此數\n");
return 0;
}
【結果截屏】
假設數組中元素為:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14