二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
原理:将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,
1. 如果x=a[n/2]则找到x,算法终止;
2. 如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x
3. 如果x>a[n/2],则我们只要在数组a的右 半部继续搜索
写法一:采用递归法
/// <summary> /// 二分法查找,二分查找的条件是原数组有序 /// 没有找到,返回-1;找到了,则返回索引 /// </summary> /// <param name="arr">数组</param> /// <param name="low">开始索引</param> /// <param name="height">结束索引</param> /// <param name="value">要查找的对象</param> static int BinarySearch(int[] arr, int low, int high, int value) { if (arr == null || arr.Length == 0 || low >= high) { return -1; } int mid = (low + high) / 2; if (value == arr[mid]) //刚好找到对象,返回索引 { return mid; } else if (value > arr[mid]) // 要查找的对象在右边 { return BinarySearch(arr, mid + 1, high,value); } else //要查找的对象在左边 { return BinarySearch(arr, low, mid - 1, value); } }
写法二:
static int BinarySearch2(int[]arr,int value) { int low = 0, high = arr.Length - 1,mid=0; while (low <= high) { mid = (low + high) / 2; if(value== arr[mid]) { return mid; } if (value > arr[mid])//在右侧 { low = mid + 1; } else//在左侧 { high = mid - 1; } } return -1; }
运行结果
static void Main(string[] args) { Console.WriteLine($"数据算法"); var arr1 = GetArrayData(8, 1, 22); Console.WriteLine($"生成未排序数据arr1:{ShowArray(arr1)}"); //var arr2 = BubbleSort(arr1); //Console.WriteLine($"冒泡排序:{ShowArray(arr2)}"); var arr3 = SelectSort(arr1); Console.WriteLine($"选择排序arr3:{ShowArray(arr3)}"); var val = arr3[3]; var index= BinarySearch(arr3, 0, arr1.Length - 1,val); Console.WriteLine($"{val}在 arr3中出现的索引位置是{index}"); var val2 = arr3[4]; var index2 = BinarySearch2(arr3, val2); Console.WriteLine($"{val2}在 arr3中出现的索引位置是{index2}"); Console.ReadLine(); }