一個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;這樣會造成不必要的麻煩,程序也會出錯。



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