System.out.println(binarySearchRecursionNon(array, 7, array[0], array[len-1]));
}
/**
-
二分查找(递归)
-
@param arry 递增数组
-
@param value 待查找数值
-
@param start 起始查找位置
-
@param end 末查找位置
-
@return
*/
private static int binarySearchRecursion(int arry[],int value,int start,int end)
{
if(start > end)
return -1;int mid=start + (end-start)/2;
if(arry[mid] == value)
return mid;else if(value < arry[mid])
{
end = mid - 1;
return binarySearchRecursion(arry,value,start,end);
}
else
{
start = mid + 1;
return binarySearchRecursion(arry,value,start,end);
}
}
/** -
二分查找(非递归)
-
@param arry 递增数组
-
@param value 待查找数值
-
@param start 起始查找位置
-
@param end 末查找位置
-
@return
*/
private static int binarySearchRecursionNon(int arry[],int value,int start,int end)
{
while(start <= end){
int mid=start + (end-start)/2;if(arry[mid] == value)
return mid;else if(value < arry[mid])
{
end = mid - 1;
}else
start = mid + 1;
}
return -1;
}
}
### **在轮转后的有序数组上应用二分查找法**
之前我们说过二分法是要应用在有序的数组上,如果是无序的,那么比较和二分就没有意义了。
不过还有一种特殊的数组上也同样可以应用,那就是“轮转后的有序数组(Rotated Sorted Array)”。它是有序数组,取其中某一个数为轴,将其之前的所有数都轮转到数组的末尾所得。比如{7, 11, 13, 17, 2, 3, 5}就是一个轮转后的有序数组。非严格意义上讲,有序数组也属于轮转后的有序数组——我们取首元素作为轴进行轮转。
下边就是二分查找法在轮转后的有序数组上的实现(假设数组中不存在相同的元素)
/**
-
在轮转后的有序数组上应用二分查找法
-
@param array
-
@param low
-
@param high
-
@param target
-
@return
*/
int searchInRotatedSortedArray(int array[], int low, int high, int target)
{
while(low <= high)
{
int mid = (low + high) / 2;
if (target < array[mid])
if (array[mid] < array[high]) // the higher part is sorted
high = mid - 1; // the target would only be in lower part
else // the lower part is sorted
if(target < array[low]) // the target is less than all elements in low part
low = mid + 1;
else
high = mid - 1;else if(array[mid] < target) if (array[low] < array[mid]) // the lower part is sorted low = mid + 1; // the target would only be in higher part else // the higher part is sorted if (array[high] < target) // the target is larger than all elements in higher part high = mid - 1; else low = mid + 1; else // if(array[mid] == target) return mid;
}
return -1;
}
对比普通的二分查找法,为了确定目标数会落在二分后的哪个部分,我们需要更多的判定条件。但是我们还是实现了O(log n)的目标。
### **二分查找法的缺陷**
二分查找法的O(log n)让它成为十分高效的算法。不过它的缺陷却也是那么明显的。就在它的限定之上:
必须有序,我们很难保证我们的数组都是有序的。当然可以在构建数组的时候进行排序,可是又落到了第二个瓶颈上:它必须是数组。
### 前端框架
前端框架太多了,真的学不动了,别慌,其实对于前端的三大马车,Angular、React、Vue 只要把其中一种框架学明白,底层原理实现,其他两个学起来不会很吃力,这也取决于你以后就职的公司要求你会哪一个框架了,当然,会的越多越好,但是往往每个人的时间是有限的,对于自学的学生,或者即将面试找工作的人,当然要选择一门框架深挖原理。
以 Vue 为例,我整理了如下的面试题。
![Vue部分截图](https://img-blog.csdnimg.cn/img_convert/c6738a80c94640db83f7ffbf487ac5f0.png)
**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**