您的位置:首页 > 其它

二分查找法(递归与循环实现)

2015-09-06 17:39 357 查看
问题:

给定一个排序数组和一个数k,要求找到第一个k的位置和最后一个k的位置

解析:

由于给定的数组是从小到大排序的,故可以按照二分查找法来找,下面分别从递归和循环两种方法来阐述:

//递归方法
int GetFirstK(int* data, int length, int k, int start, int end)
{
if (start > end)
return -1;
int middleindex = (start + end) / 2;
int middledata = data[middleindex];
if (middledata>k)
{
end = middleindex - 1;
}
else if (middledata<k)
{
start = middleindex + 1;
}
else
{
if (middleindex==0||(middleindex>0&&data[middleindex-1]!=k))//判断左边的元素是否等于k,若等于,说明第一个k在左边,否则第一个k就是middledata
{
return middleindex;
}
else
{

end = middleindex - 1;
}
}
return  GetFirstK(data, length, k,start, end);
}
//循环法
int GetFirstK(int* data, int length, int k)
{
int start = 0;
int end = length - 1;
while (start<=end)
{

int middleindex = (start + end) / 2;
int middledata = data[middleindex];
if (middledata<k)
{
start = middleindex + 1;
}
else if (middleindex>k)
{
end = middleindex - 1;
}
else
{
if (middleindex==0||(middleindex>0&&data[middleindex-1]!=k))
{
return middleindex;
}
else
{
end = middleindex - 1;
}
}
}

return -1;

}
//递归法
int GetLastK(int* data, int length, int k, int start, int end)
{
if (start>end)
{
return -1;
}
int middleindex = (start + end) >> 1;
int middledata = data[middleindex];
if (middledata<k)
{
start = middleindex + 1;
}
else if (middledata>k)
{
end = middleindex - 1;
}
else
{
if (middleindex==length-1||(middleindex<length-1&&data[middleindex+1]!=k))
{
return middleindex;
}
else
{
start = middleindex + 1;
}
}
return GetLastK(data, length, k, start, end);
}
//循环法
int GetLastK(int* data, int length, int k)
{
int start = 0;
int end = length - 1;
while (start<=end)
{
int middleindex = (start + end) >> 1;
int middledata = data[middleindex];
if (middledata>k)
{
end = middleindex - 1;
}
else if (middledata<k)
{
start = middleindex + 1;
}
else
{
if (middleindex==length-1||(middleindex<length-1&&data[middleindex+1]!=k))
{
return middleindex;
}
else
{
start = middleindex + 1;
}
}
}
return -1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: