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
posted on 2021-04-16 15:33  摸鱼time  阅读(430)  评论(0编辑  收藏  举报