/// <summary>
/// 位移运算符:>>(high-low)>>1相当于(high-low)/2 (high-low)*2位移运算符(high-low)<<1
/// </summary>
/// <param name="a"></param>
/// <param name="n"></param>
/// <param name="value"></param>
/// <returns></returns>
public int SelectValue_0(int[] a,int n,int value)
{
int low = 0;
int high = n - 1;
while (low <= high)
{
int mid = low + ((high - low) >> 1);
if (value == a[mid]) return mid;
else if (value > a[mid])
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
/// <summary>
/// 查找第一个值等于给定值
/// </summary>
/// <param name="a"></param>
/// <param name="n"></param>
/// <param name="value"></param>
/// <returns></returns>
public int SelectFirstValue(int[] a, int n, int value)
{
int low = 0;
int high = n - 1;
while (low <= high)
{
int mid = low + ((high - low) >> 1);
if (a[mid] > value)
high = mid - 1;
else if (a[mid] < value)
low = mid + 1;
else if (mid == 0 || a[mid - 1] != value)
return mid;
else
high = mid - 1;
}
return -1;
}
/// <summary>
/// 查找最后一个值等于给定值
/// </summary>
/// <param name="a"></param>
/// <param name="n"></param>
/// <param name="value"></param>
/// <returns></returns>
public int SelectValueByEnd(int[] a, int n, int value)
{
int low = 0;
int high = n - 1;
while (low <= high)
{
int mid = low + ((high - low) >> 1);
if (a[mid] > value)
high = mid - 1;
else if (a[mid] < value)
low = mid + 1;
else if (mid == high || a[mid + 1] != value)
return mid;
else
low = mid + 1;
}
return -1;
}
/// <summary>
/// 查找第一个大于给定值的数
/// </summary>
/// <param name="a"></param>
/// <param name="n"></param>
/// <param name="value"></param>
/// <returns></returns>
public int SelectValueBigByFirst(int[] a, int n, int value)
{
int low = 0;
int high = n - 1;
while (low <= high)
{
int mid = low + ((high - low) >> 1);
if (a[mid] >= value)
{
if (mid == 0 || a[mid - 1] < value) return mid;
else
high = mid - 1;
}
else
low = mid + 1;
}
return -1;
}
//查找最后一个大于给定值的数
public int SelectValueMinByEnd(int[] a, int n, int value)
{
int low = 0;
int high = n - 1;
while (low <= high)
{
int mid = low + ((high - low) >> 1);
if (a[mid] >= value)
{
if (mid == high || a[mid + 1] < value)
return mid;
else
low = high + 1;
}
else
low = mid + 1;
}
return -1;
}
二分法查找和二分法变形
最新推荐文章于 2023-12-22 13:16:35 发布