精典算法之二分查找法

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

 二分查找法是已经排好顺序的集合,要从集合的中间开始查找,如果这个项小于我们要查找的数,则这个项前边的所有数都小于我们要查找的对象
 就无需再浪费时间去查在前边的数查找;如果搜寻的数天于我们要查找的对象那么这个数的后边的数都大于我们要查找的对象,则后边的数我们也不用再去查找了。

下边我会用c#和c++两种语言给出代码

c#二分查找代码

 static void Main(string[] args)
        {
            int[] _array={ 1,3,5,6,10,14,16,20,21,23,28};
            int _findValue = BinSearch(_array, 0, _array.Length, 3);
            if (_findValue == -1)
            {
                Console.WriteLine("not find");
            }
            else
            {
                Console.WriteLine("find the value at " + _findValue);
            }
            Console.ReadLine();
        }

        static int BinSearch(int[] _array, int start, int end, int key)
        {
            int left, right;
            int mid;
            left = start;
            right = end;

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

                if (key < _array[mid])
                {
                    right = mid - 1;
                }
                else if (key > _array[mid])
                {
                    left = mid + 1;
                }
                else
                    return mid;
            }
            return -1;
        }

  

c++二分查找代码

int BinSearch(const int* Array,int start,int end,int key)
{
	int left,right;
	int mid;
	left=start;
	right=end;
	
	while(left<=right)
	{
		mid = (left + right)/2;

		if(key < Array[mid])
		{
			right = mid - 1;
		}
		else if(key > Array[mid])
		{
			left = mid + 1;
		}
		else
			return mid;
	}
	return -1;
}

int main(int argc,char* argv[])
{
	int _array[11] ={ 1,3,5,6,10,14,16,20,21,23,28};

	int _findInt =BinSearch( _array,0,(sizeof _array)/(sizeof _array[0]),3);
	if(_findInt == -1)
	{
		cout<<"not find"<<endl;
	}
	else
	{
		cout<<"find the Value at  "<<_findInt<<endl;
	}
	
	 return 0;
}

  

posted @ 2013-09-04 14:07  li-peng  阅读(7264)  评论(0编辑  收藏  举报