二分法查找

二分法查找核心思想:j_0001.gif

要给一个有序数组,要不然二分法没法应用
startIndex=0,endIndex=ary.Length-1;
middleIndex=(startIndex+endIndex)/2;
middle=ary[middleIndex];
一半一半的排除,
当目标值等于中值时,中值所在的位置就是目标值索引;
当中值大于目标值时,就把后面的一半排除掉,目标不可能在后面的一半中;
当中值小于目标值时,就把前面的一半排除,目标不可能在前面的一半中;
当起始索引大于结束索引时,说明目标值不再数组中。
以此类推,直到有结果。

class Program
{
/// <summary>
/// 在主函数中写应用程序要运行的部分
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//先给定一个有序数组
int[] ary = new int[] { 2, 3, 4, 5, 6, 7, 8 };
//要找的目标值
int target = 8;
//打印目标值在有序数组中的索引,调用Dichotomy()函数
Console.WriteLine(Dichotomy(ary,target ,0,ary.Length-1));
}
/// <summary>
/// 在这里我们把二分法的具体步骤做成一个函数,方便在Main函数中使用,
///在Main函数中如果要用到二分法找目标值的索引,就直接调用这个函数即可
/// 二分法核心思想:要给一个有序数组,要不然二分法没法应用
///                 startIndex=0,endIndex=ary.Length-1;
///                 middleIndex = (startIndex + endIndex) / 2;
///                 middle = ary[middleIndex]
///                 一半一半的排除,
///                 当目标值等于中值时,中值所在的位置就是目标值索引,
///                 当中值大于目标值时,就把后面的一半排除掉,目标不可能在后面的一半中,
///                 当中值小于目标值时,就把前面的一半排除,目标不可能在前面的一半中,
///                 当起始索引大于结束索引时,说明目标值不再数组中。
///                 以此类推,直到有结果。
/// </summary>
/// <param name="ary">要查找的数组</param>
/// <param name="target">目标值</param>
/// <param name="startIndex">起始索引</param>
/// <param name="endIndex">结束索引</param>
/// <returns>返回目标值在数组中的索引</returns>
static int Dichotomy(int[] ary, int target, int startIndex, int endIndex)//二分法查找
{
//如果起始索引大于结束索引,则目标值不存在,返回-1
if (startIndex>endIndex)
{
return -1;
}
//中值索引等于(起始索引+结束索引)/2
int middleIndex = (startIndex + endIndex) / 2;
//中值等于中值索引对应的数组中的元素
int middle = ary[middleIndex];
//如果中值等于目标值,那么中值索引就是目标值在数组中的索引,返回中值索引
if (middle==target)
{
return middleIndex;
}
//如果中值大于目标值,那么目标值在中值的前面,结束索引变为中值索引-1
if (middle>target)
{
endIndex = middleIndex - 1;
}
//如果中值小于目标值,那么目标值在中值的后面,起始索引变为中值索引+1
if (middle<target)
{
startIndex = middleIndex + 1;
}
//递归思想,调用这个函数继续查找,直到有结果为止
return Dichotomy(ary, target, startIndex, endIndex);
}
}

注意:j_0071.gif

(1)递归就是在过程或函数里调用自身;
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章