二分查找法
一、算法思想:
对于一个已经排序好的序列(使用二分查找法的前提条件,在本篇文章中假设序列是升序排列的),在查找某个元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止。如果查到了这个元素,返回元素所在的序列的位置,如果没有查到,返回-1。
二、程序实现:
《二分查找学习札记》这篇博客详细讲解了二分查找法以及常见的主要问题,链接:http://www.cppblog.com/converse/archive/2009/10/05/97905.html
三、附上JAVA版的用迭代方式和递归方式实现二分查找算法:
public class BinSearch { public static void main(String[] args) { int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int searchNum = 8; //调用方法查找: //1、迭代方式: int returnNum_iteration = binarySearch_iteration(array, searchNum); System.out.print("迭代方式的输出结果:"); System.out.println("要查找的元素在数组的下标:" + returnNum_iteration); //2、递归方式: int returnNum_recurse = binarySearch_recurse(array, searchNum, 0, array.length - 1); System.out.print("递归方式的输出结果:"); System.out.println("要查找的元素在数组的下标:" + returnNum_recurse); } //迭代方式实现二分查找 public static int binarySearch_iteration(int[] array, int searchNum) { int low=0; int high=array.length-1; int middle=0; while (low <= high) { middle = low + (high - low) / 2; // int middle = (low + high) / 2; if (searchNum == array[middle]) { return middle; } else if (searchNum > array[middle]) { low=middle+1; } else { high=middle-1; } } return -1; } //递归方式实现二分查找 public static int binarySearch_recurse(int[] array, int searchNum, int low, int high) { if (low <= high) { int middle = low + (high - low) / 2; // int middle = (low + high) / 2; if (searchNum == array[middle]) { return middle; } else if (searchNum > array[middle]) { return binarySearch_recurse(array, searchNum, middle + 1, high); } else { return binarySearch_recurse(array, searchNum, low, middle - 1); } } return -1; } }
注释:
1、什么是递归:
递归就是程序不停地间接或者直接调用自身,直到满足条件后退才出的一种算法。下面是递归实现阶乘计算的例子:
(1)计算n的阶乘的代码:
public long Factorial(int n) { if (n == 0)//限制条件,对该方法调用自己做了限制 return 1; return n * Factorial(n - 1); }
(2)递归执行图: