关于二分查找,之前在学习数据结构的时候已经学习过了,但是时隔半年,发现已经忘得七七八八,决定做一个二分查找的总结,明年找工作时如果印象不深刻了,就回来看看
首先要知道二分查找针对的是有序数列,时间复杂度为O(),接下来看代码:
//循环查找
int FindValue(int *arr,int n,int x)//arr是数组,n是数组长度,x是要查找的元素
{
int pos = -1;
if(NULL = arr || n < 1) return pos;
int left = 0,right = n-1;
int mid = (right – left +1) /2 + left;//防止数字溢出整形的最大长度
while (left <= right)//注意这里有个 等于号
{
if (x < arr[mid])
{
right = mid - 1;
}
else if (x > arr[mid])
{
left = mid + 1;
}
else
{
while(mid > left && x = arr[mid-1]) mid--;//如果数组中出现重复数字,取最左边一位
pos = mid;
}
}
return pos;
}
关于递归查找,老师询问的时候,竟然一点思路没有,后来记住了老师说的话,如果发现当前变量不够解决问题,那么就加变量,就像下象棋一样,下不过怎么办,偷偷的把被吃的车,马,炮带回来。
//递归查找
int search(int *arr,int left,int right,int x)
{
int pos = -1;
int mid = (right – left + 1 )/2 + left;
if(left <= right)
{
if(x < arr[mid])
{
search(arr,left,mid-1,x);
}
else if(x > arr[mid])
{
search(arr,mid+1,right,x);
}
else
{
while(mid < left && x = arr[mid - 1]) mid --;
pos = mid;
}
}
return pos;
}
int SearchValue(int *arr,int n,int x)
{
if (NULL = arr || n < 1 ) return -1 ;
else return Search(arr,0,n-1,x);
}