二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功.
第一种情况:无重复序列的查找
#include "Search.h"
int Bin_Search(char *s,char value,int n)
{
int max = n - 1;
int min = 0;
int mid = 0;
while(min <= max)
{
mid = min + (max - min) / 2; //折半查找
if(value < s[mid]) //如果小于则在,较小的一半中查找
max = mid - 1;
else if(value > s[mid]) //如果大于则,在大的一半中查找
min = mid + 1;
else
return mid; //找到回来位置
}
return -1;
}
第二种情况:存在重复元素的序列的查找,查找最小序号
如: aaaaabcccccddddeeeefff
#include "Search.h"
int Bin_Search(char *s,int value,int n)
{
int min = 0; //设置最小值为0
int max = n - 1; //设置最大值为n - 1;
int mid;
int pos = -1; //位置初始化为-1
while(min < max)
{
mid = min + (max - min)/ 2; //将字符串折半
if(s[mid] > value) //如果中间的值大于要查找的值,则在小的一半中查找
max = mid - 1;
else if(s[mid] < value) //如果中间的值小于要查找的值,则在大的一半中查找
min = mid + 1;
else //如果找到记录下位置
{
pos = mid;
max = mid - 1; //再在小的一半中继续查找
}
}
if(s[min] == value) //如果是第一个字符等于要查找的值,记下位置
pos = min;
return pos; //返回值
}
第三种情况:存在重复元素的序列的查找,查找最大序号
#include "Search.h"
int Bin_Search(char *s,int value,int n)
{
int pos = -1;
int min = 0;
int max = n - 1;
int mid = 0;
while(min < max)
{
mid = min + (max - min) / 2;
if(s[mid] < value)
min = mid + 1;
else if(s[mid] > value)
max = mid - 1;
else{
pos = mid;
min = mid + 1; //此处于查找最小序号不同
}
}
if(s[max] == value)
pos = max; //此处于查找最小序号不同
return pos;
}