用js写出二分查找(折半查找)算法和时间复杂度

  • 2021-01-01
    没想到2020稀里糊涂的已经过去了,昨天写2020年度总结的时候发现居然没什么好写的,看了看更的博客和平常的日记感觉真是没干啥正事。导致写2021年计划的时候写了一大堆,再加上2020计划了还没完成的事,我都担心今年完成不了又拖到2022年去了。
    说了这么多都是白话,还是决定从现在就动起来,一周一更,请大家监督!

一、js写出二分查找(折半查找)


1. 二分查找是什么

比如现在有一个有序数组: arr = [ 1, 2, 3, 4, 5];
我想在其中查找一个特定元素: n1=3;
二分查找就是在这个数组arr的中间开始查找,如果arr[2]正好为n1,那么就查找结束了。
如果我想查找n2=4,那么arr[2]=3 < 4,所以在数组的后半部分查找,重复这个操作。
如果我想查找n3=6,那么找到最后,这个数组就为空了,这样就表示找不到这个元素。



2. 二分查找的非递归算法
function dichotomy_search(arr, key){
	var low = 0;
	var height = arr.length - 1;
	while( low <= height ){
		var mid = parseInt(( height + low ) / 2);
		if( key == arr[mid] ){
			return mid;
		}else if( key > arr[mid] ){
			low = mid + 1;
		}else if( key < arr[mid] ){
			height = mid - 1;
		}else{
			return -1;
		}
	}
}
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = dichotomy_search(arr, 10);
console.log(result);		//返回 key在 arr的索引值


3. 二分查找的递归算法
function dichotomy_search(arr, low, height, key){
	if( low > height ){
		return -1;
	}
	var mid = parseInt((height + low) / 2);
	if( key == arr[mid] ){
		return mid;
	}else if( key > arr[mid] ){
		low = mid + 1;
		return dichotomy_search(arr, low, height, key);
	}else if( key < arr[mid] ){
		height = mid - 1;
		return dichotomy_search(arr, low, height, key);
	}
}
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = dichotomy_search(arr, 0, 10, 5);
console.log(result);		//返回 key在 arr的索引值


二、时间复杂度

  • 这个我看不懂… 找了一下资料也没能理解时间复杂度是怎么算的,现在先把这个贴过来,后面懂了再详细写写吧
  • 时间复杂度: 算法最复杂情况下的运行时间
  • 假设数组中共有n个元素,那么查找过程为:
    第1次折半: 还剩 n/2 个元素
    第2次折半: 还剩 n/4 个元素
    第3次折半: 还剩 n/8 个元素

    第k次折半: 还剩 n/2k 个元素
    最坏的情况下,最后还剩一个元素,令 n/2k=1,则得k=logn
    那么这个T(n),小于等于且接近于函数fn=logn,时间复杂度为O()=O(logn)




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值