《算法图解》JavaScrip实现二分查找、选择排序

本文介绍了如何使用JavaScript实现二分查找和选择排序。通过代码示例展示了二分查找算法和选择排序算法的详细过程,特别强调了在使用splice()方法时要注意它会改变原始数组以及其返回值的特性。
摘要由CSDN通过智能技术生成

参考文章:
http://jartto.wang/2018/11/22/algorithm1/
http://jartto.wang/2018/11/25/algorithm2/

二分查找代码如下:

function binarySearch(arr,val){
	let start = 0;
	let end = arr.length -1;
	let guess;

	while(start<=end){
		//mid是索引
		let mid = Math.ceil((start+end)/2);
		//guess是不断寻找的中间值,mid索引对应的值
		guess = arr[mid];

		if (guess === val) {
			//返回值对应索引
			return mid;
		}else if(guess>val){ //如果mid对应索引值大于要找的val,要在左侧找,此时end为mid-1
			end = mid-1;
		}else{
			start = mid+1;
		}
	}

	//如果找不到返回-1
	return -1;
}

//测试结果
binarySearch([1, 3, 5, 7, 9], 3);
1

选择排序代码如下:

function selectionSort(arr) {
	
	//newArr用于存储排列好的数组
	let newArr = [];
	let len = arr.length;

	for(let i = 0;i<len;i++){
		//我们总是假设第一个是最小值,我们要注意到arr长度是不断减少的
		let smallest = arr[0];
		let smallest_index = 0;

		//然后拿第一个和剩下的依次比较
		for(let j=1;j<len-1;j++){
			if(arr[j]<smallest){
				smallest = arr[j];
				smallest_index = j;
			}

		}
		//splice返回是一个数组
		newArr.push(arr.splice(smallest_index,1)[0])

	}

	//循环执行后返回newArr
	return newArr;

}

//结果测试
selectionSort([5, 3, 6, 2, 10]);
 [2, 3, 5, 6, 10]

我们需要注意两点:
1.splice()该方法会改变原始数组,所以arr.splice()后arr长度减少,返回每次除去最小值之后新的数组。
2.splice()返回一个数组,所以有[0]。

我们看下面的代码,arr不断变化,返回每次除去最小值之后的数组,所以每次我们就可以设最小值都是arr[0],假设第一个是最小值,但是数组arr的length不变,因为i增加的,循环次数就是length,我们通过let len = arr.length;获取len,arr传入时候,len就是一个固定的常量了

function selectionSort(arr) {
	
	//newArr用于存储排列好的数组
	let newArr = [];
	let len = arr.length;

	for(let i = 0;i<len;i++){
		//我们假设第一个(i++后是第二个)是最小值
		let smallest = arr[0];
		let smallest_index = 0;

		//然后拿第一个和剩下的依次比较
		for(let j=1;j<len-1;j++){
			if(arr[j]<smallest){
				smallest = arr[j];
				smallest_index = j;
			}

		}
		//splice返回是一个数组
		newArr.push(arr.splice(smallest_index,1)[0])
		console.log(arr);
		console.log(len);
	}

	//循环执行后返回newArr
	return newArr;
}

显示结果:

在这里插入图片描述

如果没有[0]取出数组中第一个数,像下面这样

//splice返回是一个数组
newArr.push(arr.splice(smallest_index,1))

返回的结果就会像下面一样:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值