前言
二分查找不断折半,直到找到目标数据,如果找到最后一个数据还没找到,那么就找不到了
二分查找又称为区间查找,分为四种情况
[ ]左闭右闭,( ]左开右闭,[ )左闭右开,()左开又开
左闭右闭
int Binarysearch(int* a, int n, int i)
{
int left = 0;
int right = n - 1;
while (left <= right)
{
//找到最后一个left等于right
int mid = left + (right - left) / 2;
// left mid right
if (i < a[mid])
right = mid - 1;
else if (i > a[mid])
left = mid + 1;
else
return mid;
}
return -1;
}
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
for (int i = 0; i < 10; i++)
{
printf("%d ", Binarysearch(arr, 10, i));
}
return 0;
}
左闭右开
int Binarysearch(int* a, int n, int i)
{
int left = 0;
int right = n;
while (left < right)
{
//要查找9最后一次 8 < 10
//最后left是不会等于right的,最后一个是不会找的
int mid = left + (right - left) / 2;
//left mid right
if (i < a[mid])
right = mid;
//右开
else if (i > a[mid])
left = mid + 1;
//左闭
else
return mid;
}
return -1;
}
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
for (int i = 0; i < 10; i++)
{
printf("%d ", Binarysearch(arr, 10, i));
}
return 0;
}
左开右闭
// ( ]
int Binarysearch(int* a, int n, int x)
{
int left = -1;
// > -1 才有0,没有-1
int right = n - 1;
while (left < right)
{
int mid = left+ (right - left) / 2 + 1;//差别
// + 1为了使程序不死循环,画图更加清晰
//left mid right
if (x > a[mid])
left = mid;
else if (x < a[mid])
right = mid - 1;
else
return mid;
}
return -1;
}
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
for (int i = 0; i < 10; i++)
{
printf("%d ", Binarysearch(arr, 10, i));
}
return 0;
}
左开右开
// ( )
int Binarysearch(int* a, int n, int x)
{
int left = -1;
int right = n + 1;
while (left < right)
{
int mid = left + (right - left) / 2;
//left mid right
if (x > a[mid])
left = mid;
else if (x < a[mid])
right = mid;
else
return mid;
}
return -1;
}
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
for (int i = 0; i < 10; i++)
{
printf("%d ", Binarysearch(arr, 10, i));
}
return 0;
}
总结
( ),[ ) ,[ ] 这三种比较相似,( ]这个画图也可以轻松解决
最后在这里祝大家题题AC,好运连连