查找的目的是什么?
查找到关键字绑定的信息,这里也就是与关键字映射的那个信息
一.二分查找算法
int binary_search(int *num,int n,int x)
{
int head =0,tail = n-1, mid;
while(head <= tail) //这边可以相等就是为了查找数组的边界是否为解
{
mid =(head+tail) >> 1;
if(num[mid] == x) return mid;
else if(num[mid] < x) head = mid+1;
else tail = mid- 1;
}
return -1;
}
特殊情况的二分查找
//11111110000000
int binary_search1(int *num,int x,int n)
{
int head = -1,tail = n-1,mid;//增加了一个下标为-1的虚拟头,防止都为0时,返回的值有歧义
while(head <= tail)
{
mid = (head+tail+1) >>1;
if(num[mid] == x) head = mid;//等于要查找的值时把左边的全都舍弃,因为这个时候mid位置也有可能是最后一个x所以,不能像原来的二分法舍掉,
//但是这样因为每次循环没有往后走一位,就会导致head一直不变,陷入死循环,比如当head为3,tail为4时,
//head就会一直为3陷入一个死循环,为了避免这种情况,就需要mid向上去整也就是mid=(head+tail+1)>>1
else tail = mid -1;//这边还是会自动往前再走一位,所以右边不会陷入死循环问题,但是当数组所有位都是0时,又会产生新的问题,
//那就是当循环到head等于tail时,返回的为0,这是就会有个歧义,是返回的位置为0位还是,没有找到返回0,
//所以这时得在数组前加一个虚拟头head=-1,tail =n,这样查找到最左边没有找到时返回的就是-1。
}
return head;//当head等于tail时,head的位置就是最后一个1
}
特殊情况二分查找
000000001111111,找到第一个1的位置
int binary_search2(int*num,int x,int n)
{
int head =0,tail = n,mid;
while(head <= tail)
{
mid =(head+ tail) >> 1;//这里是向下去整,以3的位置为0,4的位置为1举例,如果向上取整tail一直为原来的位置造成死循环
if(num[mid] == x) tail = mid;//这里要舍掉右边,但是不能舍掉mid本身,这样mid就不能向上去整,要向下取整
else head = mid+1;
}
return head = n ?-1:head;
}