二分查找算法
1:什么是二分查找算法?二分查找算法是一种时间复杂度为log(n)的查找算法,相比较于普通的遍历查找时间复杂度会大大降低(所以二分查找又通常被叫做折半查找),每次将查找完的数组将size会减半
2:二分查找的重要特点为:左右边界需要特别明确,并且二分查找的算法规则基于的是数组在有序的情况下进行查找,如果查找同一个数字并且需要确定数量将进行二次二分查找,总之明确二分查找的原理为:1:数组大致有序 2:时间要求的复杂度较小的情况下可以考虑二分查找算法
3二发查找不只是一种算法,更多体现的可能是一种思想,比如开平方根,分蛋糕,或者棋盘格问题都有可能会用到二分算法问题
二分查找的代码举例:
#include<stdio.h>
#include<stdlib.h>
//因为元素中的元素是不重复且为升序排序符合二分查找的特点所以可以使用二分查找
void mid_search(int and,int num, int flag)
{
//malloc开辟ans数组的空间大小为num
int head=0,tail=num-1,mid;
while(head<=tail)
{
mid=(tail+head)/2;//为了防止int类型整形的溢出,可以将代码换为id=low+(head-low)>>1;
//因为int类型支持的数据长度是有限的,而此代码可以一直保证的值一直大于0,除非return循环
if(ans[mid]==flag)
{
printf("%d",mid);
return ;
}
if(ans[mid]<flag)
{
head=mid+1;
}
if(ans[mid]>flag)
{
tail=mid-1;
}
}
printf("-1");
return ;
}
void search(int* nums, int numsSize, int target){
if(numsSize == 1 && nums[0] == target){
printf("0");
return;
}
mid_search(nums, numsSize, target);
return;
}
int main()
{
int num;
scanf("%d",&num);
int *ans=NULL;
ans=(int *)malloc(sizeof(int)*num);
for(int i=0;i<num;i++)
{
scanf("%d",&ans[i]);
}
int flag;
scanf("%d",&flag);
search(ans,num,flag);
free(ans);
return 0;
}
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
2:二次二分查找算法
题解:
class Solution {
public:
int countTarget(vector<int>& scores, int target) {
int len = scores.size();
int left1 = 0, right1 = len - 1, left2 = 0, right2 = len - 1;
sort(scores.begin(),scores.end());
while (left1 <= right1) {
int mid = (left1 + right1) / 2;
if (scores[mid] >= target) {
right1 = mid - 1;
} else {
left1 = mid + 1;
}
}
while (left2 <= right2) {
int mid = (left2 + right2) / 2;
if (scores[mid] <= target) {
left2 = mid + 1;
} else {
right2 = mid - 1;
}
}
return left2 - right1 - 1;
}
};
这里的二分查找算法为找到第一次含有数的边界点,再从第二次的边界点进行查找
有关二分查找的思想例题见头歌实践教学平台
编程刷题中的分蛋糕和棋盘格数
总体以上就是二分查找的代码和整体思想,关于二分查找思想中的两道例题题解以及思想我会持续更新在二分查找思想用法文章中