-
典型的二分查找算法,通过对mid不断的判断来确定最终的key值得位置。代码如下:
-
int getnumber(int intarr[], int length, int key)
{
int num = 0;
int start = 0;
int end = length - 1;
while (start <= end)//这里必须是<=,很重要的一点,二分查找的重点
{
int mid = (start + end) / 2;
if (intarr[mid] == key)
{
return mid;
}
if (intarr[mid] > key)
{
end = mid - 1;
}
if (intarr[mid] < key)
{
start = mid + 1;
}
}
return -1;
}
变种1、查找第一个与key相等的元素。代码如下:由于是第一个等于key的元素,那么我们可以确定最后的位置在start位置。判断start位置即可。
int firstSameKey(int intarr[], int length, int key)
{
int num = 0;
int start = 0;
int end = length - 1;
while (start <= end)
{
int mid = (start + end) / 2;
if (intarr[mid] >= key)
{
end = mid - 1;
}
if (intarr[mid] < key)
{
start = mid + 1;
}
}
if (start >= 0 && intarr[start] == key)
{
return start;
}
return -1;
}
变种2、查找最后一个等于key的元素,由于是最后一个等于key的元素,那么我们可以确定最后的位置在end位置。判断end位置即可。
int lastSameKey(int intarr[], int length, int key)
{
int num = 0;
int start = 0;
int end = length - 1;
while (start <= end)
{
int mid = (start + end) / 2;
if (intarr[mid] <= key)
{
start = mid + 1;} if (intarr[mid] > key) { end = mid - 1; }
}
if (end <= length-1 && intarr[end] == key)
{
return end;
}
return -1;
}
变种三,最后一个小于等于key的元素,代码如下:
int lastSameLessKey(int intarr[], int length, int key)
{
int num = 0;
int start = 0;
int end = length - 1;
while (start <= end)
{
int mid = (start + end) / 2;
if (intarr[mid] <= key)
{
start = mid + 1;} if (intarr[mid] > key) { end = mid - 1; }
}
return end;
}
二分查找的变种还有第一个大于等于key的元素,第一个大于等于key的元素,第一个小于key的元素的等等,我们可以根据要求先判断需要返回的是end还是start,然后尽可能的吧符合要求的元素落到start或者end上面。
比如第一个大于等于key的元素,返回的是start,
int firstSameBigKey(int intarr[], int length, int key)
{
int num = 0;
int start = 0;
int end = length - 1;
while (start <= end)
{
int mid = (start + end) / 2;
if (intarr[mid] < key)//由于我们最后的是大于等于,当mid值<key的时候,需要处理star,那么必须处理start。
{
start = mid + 1;} if (intarr[mid] >= key)//由于我们最后的是start,当mid值>=key的时候,处理end。 { end = mid - 1; }
}
return start;
}
查找最后一个小于key的元素,最后一个肯定是end啦。
int lastLessKey(int intarr[], int length, int key)
{
int num = 0;
int start = 0;
int end = length - 1;
while (start <= end)
{
int mid = (start + end) / 2;
if (intarr[mid] < key)
{
start = mid + 1;} if (intarr[mid] >= key) { end = mid - 1; }
}
return end;
}
二分查找这点是关键:while (start <= end),切记切记啊。
二分查找及其举一反三的使用。
最新推荐文章于 2024-08-14 12:02:23 发布