您好,欢迎访问一九零五行业门户网

二分法查找介绍

二分法查找
今天讲一下“二分法查找”,二分法查找思路就是在一段顺序数组中,每次和某一段数组中间数比大小。二分法查找的缺点是数组必须是顺序的(我以由小到大排序数据为例),优点是查询效率极高,时间复杂度是log2n。这种查找方式越是在大数据下,效果越是明显。下面附上源代码和单元测试,源代码包含两种算法,一种是循环一种是递归,大家多参考:
源代码:
       /// <summary>
       /// 使用二分法查找一个数据所在问题位置。(递归方法)
       /// 数组必须是从小到大排序的,如果是未排序数据可使用<see cref="bitmapsort"/>类
       /// 或者<see cref="straightinsertionsort"/>类进行排序。
       /// 如果要查找的值在数组中不存在,返回-1。
       /// </summary>
       /// <param name="array">数组</param>
       /// <param name="value">要查找的值</param>
       /// <returns>返回第几个,如果要查找的值在数组中不存在,返回-1</returns>
       public static int search(int[] array, int value)
       {
           if (array == null) { throw new argumentexception(array is null); }
           if (array[array.length - 1] == value) { return array.length - 1; }
           return search(array, 0, array.length - 1, value);
       }
       private static int search(int[] array, int beginindex, int endindex, int value)
       {
           int middle = (beginindex + endindex) / 2;
           if (endindex == beginindex)
           { return array[beginindex] == value ? beginindex : -1; }
           else if (endindex == beginindex + 1)
           {
               if (array[beginindex] == value) { return beginindex; }
               else if (array[endindex] == value) { return beginindex; }
               else { return -1; }
           }
           if (array[middle] == value)
           { return middle; }
           else if (array[middle] > value)
           { return search(array, beginindex, middle, value); }
           else if (array[middle] < value)
           { return search(array, middle, endindex, value); }
           return -1;
       }
/// <summary>
       /// 使用二分法查找一个数据所在问题位置。(循环方法)
       /// 数组必须是从小到大排序的,如果是未排序数据可使用<see cref="bitmapsort"/>类
       /// 或者<see cref="straightinsertionsort"/>类进行排序。
       /// 如果要查找的值在数组中不存在,返回-1。
       /// </summary>
       /// <param name="array">数组</param>
       /// <param name="value">要查找的值</param>
       /// <returns>返回第几个,如果要查找的值在数组中不存在,返回-1</returns>
       public static int search2(int[] array, int value)
       {
           int beginindex = 0;
           int endindex = array.length - 1;
           while (true)
           {
               if (endindex - beginindex <= 1)
{
if (value == array[beginindex]) { return beginindex; }
if (value == array[endindex]) { return endindex; }
{ return -1; }
}
int middle = (beginindex + endindex) / 2;
if (value < array[middle]) { endindex = middle; }
if (value == array[middle]) { return middle; }
if (value > array[middle]) { beginindex = middle; }
           }
       }
单元测试:
       [testmethod()]
       [deploymentitem(zjyworkcodelibrary.dll)]
       public void searchtest()
       {
           random random = new random();
           int[] array2 = new int[100];
           for (int i = 0; i < 100; i++)
           {
               array2[i] = random.next(0, 1000);
           }
           int[] array3 = bitmapsort.sort(array2);
           for (int i = 0; i < array3.length; i++)
           {
               assert.areequal(binarysearch.search(array3, array3[i]), i);
               assert.areequal(binarysearch.search2(array3, array3[i]), i);
           }
           assert.areequal(binarysearch.search(array3, 9999), -1);
           assert.areequal(binarysearch.search2(array3, 9999), -1);
       }
更多二分法查找介绍。
其它类似信息

推荐信息