javascript實現二分法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM