什么是二分查找:
二分查找又称为折半查找;要求在完全有序的数组或顺序表中,进行查找某个数据的所处位置(下标)的方法。
二分查找的思想:首先,假设表中元素是按升序排列;将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表;重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
C代码(非递归法):
int Search(int*p,int left,int right,int val) //从小到大完全有序
{
int pos = -1; //纪录位置(下标)
while(left <= right)
{
int mid = (right - left + 1)/2 + left; //mid=(right+left)/2(可能数据过大溢出)
if(val < p[mid])
{
right = mid-1; //查找前半部分
}
else if(val > p[mid])
{
left = mid+1; //查找后半部分
}
else
{
while(mid > left && p[mid-1] == val) --mid; /*若有多个所查找元素,查找其
pos = mid; 第一次出现的位置 */
break;
}
}
return pos;
}
C代码(递归法):
int Search(int*p,int left,int right,int val)
{
int pos = -1;
if(left <= right)
{
int mid = (right - left + 1)/2 + left;
if(val < p[mid])
{
pos = Search(p,left,mid-1,val);
}
else if(val > p[mid])
{
pos = Search(p,mid+1,right,val);
}
else
{
while(mid > left && p[mid-1] == val) --mid;
pos = mid;
}
}
return pos;
}