C#语法基础12_二分查找BinarySearch
C#语法基础12_二分查找BinarySearch
适用于有序数据,本文以增序数据为例
常规算法的重要参数
// 方法入参
data // 有序数据
key // 待查值
// 方法内部的重要局部变量
lower // 左端点
upper // 右端点
middleindex //中值索引
常规算法
while (lower <= upper) // 循环条件:仍有元素可查找
find the middle element
if (key == middle element) // 找到
return middle
// 未找到,判断哪一个半段继续查找
else if (key < middle element)
upper = middle -1 // 查找左半段
else // key > middle element ,查找右半段
lower = middle + 1
end while // 结束循环
if key == element at lower // 若值待查值等于左端点返回左端点索引
return lower
else
return -1
例子
class Program
{
static void Main(string[] args)
{
//增序数据
int[] myArray = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11};
Console.WriteLine(BinarySearch(myArray, 6));//调用方法
}
//二分查找
static int BinarySearch(int[] myArray, int key)
{
int lower = 0; // 左端
int upper = myArray.Length - 1; // 右端
int middleIndex; //中值索引
while (lower <= upper)
{
middleIndex = (lower + upper) / 2; //左右端的中值索引
if (key == myArray[middleIndex]) // 判断中值是否等于目标值
return middleIndex;
else if (key < myArray[middleIndex]) // 中值小于目标值,在左侧继续进行二分查找
{
upper = middleIndex - 1;
}
else // 中值大于目标值,在右侧继续进行二分查找
{
lower = middleIndex + 1;
}
}
if (key == myArray[lower]) //判断目标值是否为当前的左端点值(不会为右端点值)
return lower;
else return -1;
}
}
// 输出
// 5
递归算法的重要参数
// 方法入参
data // 有序数据
key // 待查值
lower // 左端点
upper // 右端点
// 方法内部的重要局部变量
middleindex //中值索引
递归算法
if (lower > upper) // 没有更多的元素可查找
return -1 // 返回一个非索引值表示未查到
else // 递归如下
// key is in positions lower..upper, if at all
// 查找中值
if (key == middle element) // 找到
return middle //返回中值索引
// 未找到,判断哪一个半段继续查找
else if (key < middle element) // 查找左半段
return BinarySearch(data, key, lower, middle -1)
else // key > middle element ,查找右半段
return BinarySearch(data, key, middle + 1, upper)
end if
例子
class Program
{
static void Main(string[] args)
{
//增序数据
int[] myArray = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
int lower = 0;
int upper = myArray.Length - 1;
Console.WriteLine(RecursiveBinarySearch(myArray, 6, lower, upper)); //方法调用
}
// 递归代码
static int RecursiveBinarySearch(int[] myArray, int key, int lower, int upper)
{
int middleindex; // 中值索引
middleindex = (lower + upper) / 2;
if (lower > upper) // 没有更多的元素可查找
return -1; // 返回一个非索引值表示未查到
else
{
if (key == myArray[middleindex]) // 判断中值是都等于待查值
return middleindex; // 返回中值索引
// 未找到,判断哪一个半段继续查找
else if (key < myArray[middleindex])
{
return RecursiveBinarySearch(myArray, key, lower, upper-1); // 查找左半段,进行递归
}
else
{
return RecursiveBinarySearch(myArray, key, lower+1, upper); // 查找右半段,进行递归
}
}
}
}
// 输出
// 5
moyutime:本文仅是学习心得,观点仅供参考,祝愿读者学习途中快乐且不断有所收获。