要給一個有序數組,要不然二分法沒法應用
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)在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱爲遞歸出口。