注:一定是有序的數組,才可以使用這種算法,如果數組沒有排序則先進行排序后再調用此方法。
1、二分法是做什么的呢?
當然是查找數組中的數據了,開個玩笑,哈哈哈。
2、為啥要用這種方式呢?
二分顧名思義,就是將一組數據對半分開(比如左右兩部分,下面用左右數組表示),從中間位置開始查找,
如果中間這個值正是咱們要找的值則直接返回這個值(或者索引),如果沒有找到,那么去判斷中間的這個值和咱們要找的值哪個大,
如果中間值比咱們要找的值大,則將之前分開的數組的左面的數組再進行對半分開,遞歸直到找到咱們要的那個值才會結束,反之亦然,
但是如果就是沒有咱們找的值那么豈不是死循環了嘛,
所以要加判斷,如果遞歸到開始索引大於結束索引,也就是查到最后了還是沒有找到匹配的值,則退出。
這種搜索算法每一次比較都使搜索范圍縮小一半,這樣對於大數據量的數組,極大的提升了查找效率。
private void button1_Click(object sender, EventArgs e) { int[] arry = { 8, 15, 19, 23, 26, 31, 40, 65, 91 }; //測試 要找的數字是15 int key = 15; //查找數並返回 若有,返回該數,沒有則返回-1 int rr = BinarySearch(arry, 0, arry.Length - 1, key); } /// <summary> /// 二分法查找指定值 /// </summary> /// <param name="arr">目標數組</param> /// <param name="start">開始索引</param> /// <param name="end">結束索引</param> /// <param name="key">要查找的關鍵字</param> /// <returns></returns> public static int BinarySearch(int[] arr, int start, int end, int key) { int mid = (start + end) / 2; if (start > end) return -1;//查找不到返回-1 else { Console.WriteLine(arr[mid]);//監測查找了哪些數字 if (arr[mid] == key) return mid;//若查找到,返回該數 else if (arr[mid] > key) return BinarySearch(arr, start, mid - 1, key); else return BinarySearch(arr, mid + 1, end, key); } }