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

来源:互联网 发布:java.util.zip 加密 编辑:程序博客网 时间:2024/06/05 01:20
               
      *二分查找:
           
       一个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;}elsereturn 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;}elsereturn mid;}return -1;}</span>
总结:二分查找的关键是对边界的处理以及mid的定义,千万不能单纯的是mid=(left+right)/2;这样会造成不必要的麻烦,程序也会出错。



1 0
原创粉丝点击