二分查找

    技术2025-01-02  56

      二分查找的基本思想是在一个有序序列中,每次取待查找序列的中间元素跟目标元素进行比较,如果小于,则待查找序列定位到后半段,反之则定位到前半段,这样每次比较后都可以将范围缩小到原来的1/2.  注意:二分查找的前提是待查找序列必须是有序的.

    下面给出的是C代码的递归与非递归形式: ------------------------------------------------

    int b_recursion(int left,int right,int *data,int key) {   int mid=0;   ///左右边界可以取到相等(待查找序列内只有一个元素),   //但是右边界小于左边界表示数据不在目标队列内,查找结实   if(right < left) return -1;

      mid=(left+right)/2;

      if(data[mid]==key)      return mid;   else if(key < data[mid])//使用左段      return b_recursion(left,mid-1,data,key);   else//使用右段     return  b_recursion(mid+1,right,data,key);

    }

    //非递归实现 // int *data 表示数组 int b_search(int left,int right, int *data,int key) {    int mid=0;

       while(left <=right)      {        mid=(left+right)/2;

           if( data[mid]==key)    return mid;        else if(key > data[mid])    left=mid+1;        else if(key < data[mid])    right=mid-1;      }    return -1; }  -------------------------------------  查找跟排序在一般Web编程中多少是会用到的,不过在.net2.0中你并不需要自己编写代码来实现,.net2.0的System.Collections.Generic命名空间下的List 类可以满足一般的自定义类的排序与查找任务,你也可以直接使用Array类的静太方法 public static void Sort (T[] array, IComparer comparer); 进行排序,使用 public static int BinarySearch (T[] array, T value, IComparer comparer);进行查找. 下面是MS实现的二分查找代码: ________________________________________

    public virtual int BinarySearch(T[] array, int index, int length, T value, IComparer comparer) {     if (comparer == null)     {         comparer = Comparer .Default;     }     //MS里好象num1,num2..numx 用的比较多     int num = index;     int num2 = (index + length) - 1;     while (num <= num2)     {         int num4;         int num3 = num + ((num2 - num) >> 1); //使用移位进行除二操作         try         {             num4 = comparer.Compare(array[num3], value);         }         catch (Exception exception)         {             throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_IComparerFailed"), exception);         }         if (num4 == 0)         {             return num3;         }         if (num4 < 0)         {             num = num3 + 1;         }         else         {             num2 = num3 - 1;         }     }     return ~num; }

     

    最新回复(0)