一个90%程序员写不对的算法——二分查找

               
      *二分查找:
           
       一个90%的程序员写不对的程序,一个面试高频出现的面试题,一个开发中用之甚广的算法,一个最能体现程序员素质的代码,它就是二分查找。

图解二分查找的边界处理:


在边界处理上图中很明白,接下来说下变量的定义及其求取时的注意事项和方法:
(ps:if语句中的注意事项见代码。)
   int left=0;
   int right=size-1;//int right=size;
   在定义mid变量的时候有三种方法:
   int mid = left + ((right - left) >> 1);
   //或: mid=left+((right-left)/2);
   //或:  mid=(left&right)+(left^rigrt)>>1)
   前两种不说,就说第三种
   left&right是求相同位的和(left^rigrt)求不同位的和

方法1:(int right=size-1;)
<span style="font-size:18px;">#include<iostream>
using namespace std;
#include<assert.h>

int BinarySearch(int *a, int size, int x)
{
	assert(a);//一定不能为空,就用断言
	int left = 0;
	int right = size - 1;
	int mid = 0;
	while (left <= right)
	{
		 mid = left + ((right - left) >> 1);
		//或: mid=left+((right-left)/2);
		//或:  mid=(left&right)/*求相同位的和*/+(left^rigrt)/*求不同位的和*/>>1)
		if (a[mid]>x)
		{
			right = mid - 1;//注意边界的控制
		}
		else if (a[mid] < x)
		{
			left = mid + 1;
		}
		else
			return mid;
	}
	return -1;
}</span>
方法2:(right=size;)
<span style="font-size:18px;">#include<iostream>
using namespace std;
#include<assert.h>

int BinarySearch(int *a, int size, int x)
{
	assert(a);//一定不能为空,就用断言
	int left = 0;
	int right=size;
	int mid = 0;
	while(left<right)
	{
		 mid = left + ((right - left) >> 1);
		//或: mid=left+((right-left)/2);
		//或:  mid=(left&right)/*求相同位的和*/+(left^rigrt)/*求不同位的和*/>>1)
		if (a[mid]>x)
		{
			right=mid;//注意边界的控制
		}
		else if (a[mid] < x)
		{
			left = mid + 1;
		}
		else
			return mid;
	}
	return -1;
}</span>
总结:二分查找的关键是对边界的处理以及mid的定义,千万不能单纯的是mid=(left+right)/2;这样会造成不必要的麻烦,程序也会出错。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章