1 二分查找算法的原理
二分查找的前提是,被查找的数列是有序的(升序或降序)。首先将要查找的数据与有序数列内处于中间位置的数据进行比较,如果两者相同,则查找成功;否则就根据数据的有序性,在确定包含该数据的范围应该在数列的前半部分还是后半部分;在新确定的缩小的数据范围内,继续按照上述方法进行查找,直到查找到指定数据,表示查找成功,如果指定数据不在有序数列中,则表示查找不成功。
2 二分查找算法的手动实现
二分查找算法的手动实现如图1所示。
图1 二分查找算法的手动实现
假设要在一个有序数列中查找10,首先查找范围是整个数列,此时查找的起点是第一个元素,重点是最后一个元素,此时数列中间位置的数据是“18”,如图1①所示;因为10比18小,可以将查找范围缩小到数列的前半部分,起点不变,终点是18的前一个元素,中间位置的数据是5,如图1②所示;因为10比5大,可以将查找范围缩小到数列的后半部分,起点是5的下一个数据,终点不变,因为此时数列中只剩下两个数据了,取出第一个数据与10进行比较,此时两个数据相等,找到指定数据,如果第一个数据不相等,则再比较第二个数据。
3 二分查找算法的代码实现
二分查找算法的代码实现如图2所示。
图2 二分查找算法的代码实现
其中,第1-14行自定义了名为binarySearch()的函数实现二分查找;该函数的theValues参数表示被查找的数列,target表示指定要查找的数据。第2-4行的start表示查找范围的起点,end表示查找范围的终点,pos表示查找到数据的位置。第5行的while循环表示不断的缩小查找范围,第6行的mid表示数列的中间位置,当数列中间位置的值与要查找的值相等,则说明找到指定数据,将mid的值赋值给pos,并返回pos,如代码7-8所示;如果要查找的值小于数列中间位置的值,此时将范围缩小到数列的前半部分,即查找范围的终点变为此前中间位置的前一个数据,起点不变,如代码10-11所示;如果要查找的值大于数列中间位置的值,此时将范围缩小到数列的后半部分,即查找范围的其点变为此前中间位置的后一个数据,终点不变,如代码12-13所示。
代码第15行定义了一个有序(升序)的列表values,第16行调用binarySearch()函数,在values中搜索数据10,如果返回值pos是非负数,则说明找到指定值,否则说明没有找到指定值。