• 二分查找



      二分查找的基本思想是在一个有序序列中,每次取待查找序列的中间元素跟目标元素进行比较,如果小于,则待查找序列定位到后半段,反之则定位到前半段,这样每次比较后都可以将范围缩小到原来的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<T>类可以满足一般的自定义类的排序与查找任务,你也可以直接使用Array类的静太方法public static void Sort<T>(T[] array, IComparer<T> comparer);进行排序,使用public static int BinarySearch<T>(T[] array, T value, IComparer<T> comparer);进行查找.

    下面是MS实现的二分查找代码:
    ________________________________________

    public virtual int BinarySearch(T[] array, int index, int length, T value, IComparer<T> comparer)
    {
        if (comparer == null)
        {
            comparer = Comparer<T>.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;
    }

     

  • 相关阅读:
    使用Fiddler抓取手机APP数据包--360WIFI
    mysql 查询数据库表信息,字段信息
    jQuery动态移除和绑定事件
    Topshelf+Quatz.Net的简单使用
    教你花30分钟时间搭建一个个人博客
    泛型接口的抗变和协变
    Action<T>和Func<T>
    DateTime和DateTimeOffset的区别
    Expression<Func<TObject, bool>>与Func<TObject, bool>的区别
    C#学习笔记(1) --简叙.net体系结构
  • 原文地址:https://www.cnblogs.com/wdfrog/p/1371612.html
Copyright © 2020-2023  润新知