js查找算法

线性查找(顺序查找)

  • 可以有序可以无序
  • 代码实现
			var arr = [0,2,4,6,2,8,10];
			function seqSearch(arr,value){
				var indexArr =[];
				for(let i=0;i<arr.length;i++){
					if(arr[i]==value){
						indexArr.push(i);
					}
				}
				return indexArr;
			}
			var result = seqSearch(arr,12);
			console.log(result);

二分查找(折半查找)

  • 对一个有序数组进行查找
  • 实现思路
    • 确定该数组中间下标 mid=(left+right)/2;
    • 将需要查找的数与arr[mid]进行比较
      • 如果value>arr[mid]则向右查找
      • 如果value<arr[mid]则向左查找
      • 如果value==arr[mid]返回下标
      • 否则返回-1表示没有找到
  • 代码实现
			var arr = [0,2,4,6,8,10];
			function binarySearch(arr,left,right,value){
				if(right==left){
					if(arr[right]==value){
						return right;
					}else{
						return -1;
					}
				}
				var mid = parseInt((left+right)/2);
				if(arr[mid]==value){
					return mid;
				}else if(arr[mid]<value){
					return binarySearch(arr,mid+1,right,value);
				}else{
					return binarySearch(arr,left,mid-1,value);
				}
			}
			var result = binarySearch(arr,0,arr.length-1,4);
			console.log(result);

插值查找

  • 对二分查找的优化,mid的计算方法不同
  • mid=low+(value-arr[left])*(right-left)/(arr[right]-arr[left]);
  • 代码实现
					var arr = [0,1,2,3,4,5,6,7,8,10];
			function insertValueSearch(arr,left,right,value){
				if(value>arr[right]||value<arr[left]){
					return -1;
				}
				if(right==left){
					if(arr[right]==value){
						return right;
					}else{
						return -1;
					}
				}
				var mid = parseInt(left+(value-arr[left])*(right-left)/(arr[right]-arr[left]));
				if(arr[mid]==value){
					return mid;
				}else if(arr[mid]<value){
					return insertValueSearch(arr,mid+1,right,value);
				}else{
					return insertValueSearch(arr,left,mid-1,value);
				}
			}
			var result = insertValueSearch(arr,0,arr.length-1,6);
			console.log(result);

斐波那契查找(黄金分割查找)

  • 与二分法和插值查找类似但mid的计算方法不同
  • mid=low+f(k-1)-1
  • 数组长度需补全至f(k)-1
  • 代码实现
			var arr = [0,1,2,3,4,5,6,7,8,10];
			function f(n){
				if(n==1){
					return 1;
				}else if(n==2){
					return 1;
				}else{
					return f(n-1)+f(n-2);
				}
			}
			function fabonacciSearch(arr,left,right,value){
				if(value<arr[left]||value>arr[right]){
					return -1;
				}
				var n = right-left;
				var i = 1;
				while(n>f(i)){
					i++;
				}
				var arr1=[];
				for(let j=left;j<=right;j++){
					arr1.push(arr[j]);
				}
				for(let j=right+1;j<f(i);j++){
					arr1.push(arr[right]);
				}
				if(i==1){
					var mid = left;
				}else{
					var mid = left + f(i-1)-1;
				}
				
				console.log(mid)
				if(arr[mid]==value){
					return mid;
				}else if(arr[mid]<value){
					return fabonacciSearch(arr,mid+1,right,value);
				}else{
					return fabonacciSearch(arr,left,mid-1,value);
				}
			}
			var result = fabonacciSearch(arr,0,arr.length-1,9);
			console.log("result = "+result)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值