要给一个有序数组,要不然二分法没法应用
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); } }
(1)递归就是在过程或函数里调用自身;
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。