js 實現數組查找二分法
二分法實現原理:二分查找可以解決已經排好序數組的查找問題:只要數組中包含target(即要查找的值),那么通過不斷縮小包含target數組的范圍,最終就可以找到它。
其算法流程如下:
開始,范圍覆蓋整個數組。
將數組的中間項與target進行比較,如果target比數組的中間項要小,則到數組的前半部分繼續查找,反之,則到數組的后半部分繼續查找。
如此,每次查找可以排除一半元素,范圍縮小一半。就這樣反復比較,反復縮小范圍,最終就會在數組中找到target,或者確定原以為target所在的范圍實際為空。
對於包含N個元素的表,整個查找過程大約要經過log(2)N次比較。
遞歸實現
例1:用遞歸二分法實現array.indexOf 功能(數組為正序排列)
function indexOf(arr,target,start,end){
start = start || 0;
end = end || arr.length - 1;
if(start > end){
return -1;
}
let mid = Math.floor((start + end)/2);
if(arr[mid] > target) {
end = mid-1;
return indexOf(arr,target,start,end);
}
else if(arr[mid] < target){
start = mid + 1;
return indexOf(arr,target,start,end);
}
else {
return mid;
}
}
let a = [0,1,2,3,4,5,6,434,435];
console.log(indexOf(a,12)); //打印結果為-1
while循環實現
function indexOf(arr,target,start,end){
start = start || 0;
end = end || arr.length - 1;
let mid = Math.floor((start + end)/2);
console.log(start,end);
while(start <= end){
console.log(start,end,target,arr[mid]);
if(target > arr[mid]){
start = mid + 1;
mid = Math.floor((start + end)/2);
}
else if(target < arr[mid]){
end = mid - 1;
mid = Math.floor((start + end)/2);
}
else {
return mid ;
}
}
console.log(start,end);
return -1;
}
let a = [0,1,2,3,4,5,6,434,435];
console.log(indexOf(a,5)); //打印結果為5