二分法查找

二分法查找核心思想: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)在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱爲遞歸出口。

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