分而治之算法分为三个部分
- 分解原问题为多个子问题。
- 解决子问题,用返回解决子问题的方式的递归算法。递归算法的基本情形可以用来解决子问题。
- 组合这些子问题的解决方式,得到原问题的解。
怎样将二分搜索用分治的方法实现?
分解: 计算mid并搜索数组较小或较大的一半。
解决: 在较小的或较大的一半中搜索值。
合并: 不需要,直接返回索引值。
function binarySearchRecursive(array,value,low,high){
if(low <= high){
const mid = Math.floor((low + high) / 2);
const element = array[mid];
if(element < value){
return binarySearchRecursive(array,value,mid + 1,high);
}else if(element > value){
return binarySearchRecursive(array,value,low,mid - 1);
}else{
return mid;
}
}
return -1;
}
function binarySearch(array,value){
const sortedArray = quickSort(array);
const low = 0;
const high = sortedArray.length - 1;
return binarySearchRecursive(array,value,low,high);
}
上面的算法中,有两个函数: binarySearch和binarySearchRecursive。binarySearch进行二分搜索,binarySearchRecursive是分而治之算法。low参数以0传递,将high参数以sortedArray.length - 1传递,在已排序的数组只进行搜索。在计算mid元素的索引值后,我们确定待搜索的值比mid大还是小。如果大或小,将再次调用binarySearchRecursive函数,但是这次,在子数组中进行搜索,改变low或high参数。如果不大不小,表示找到了这个值,这就是一种基本情形。还有一种情况是low比high要大,这表示算法没有找到这个值。