基于JavaScript实现的折半查找算法示例
本文详细了基于JavaScript实现的折半查找算法,又称二分查找。这是一种针对有序列表的高效查找方法。其基本原理在于,通过不断缩小查找范围,直至找到目标元素。下面让我们深入理解其原理及操作步骤。
折半查找的核心思想在于设定上下边界,并通过比较中间元素与查找目标的大小关系,不断调整边界位置,直至找到目标元素。初始时,将第一个位置设为下边界,最后一个位置设为上边界。然后进行以下操作:计算中点位置,将中点元素与查找目标进行比较。如果中点元素小于查找目标,说明查找目标可能存在于中点元素的右侧,因此将下边界移动到中点元素的下一个位置;如果中点元素大于查找目标,说明查找目标可能存在于中点元素的左侧,因此将上边界移动到中点元素的前一个位置;如果中点元素恰好等于查找目标,那么就直接返回中点的位置。如此循环,直到找到目标元素或者确定元素不存在于列表中。
接下来,让我们看一下JavaScript实现的折半查找代码:
```javascript
function binSearch(arr, data) {
// 折半查找,也称二分查找
var upperBound = arr.length - 1; // 上边界
var lowerBound = 0; // 下边界
while (lowerBound <= upperBound) { // 当未遍历完时
var mid = Math.floor((lowerBound + upperBound) / 2); // 计算中点位置
document.write("当前中点为" + mid + '
'); // 记录选中的中点
if (arr[mid] < data) {
lowerBound = mid + 1; // 如果中点元素小于查找目标,将下边界移动到中点元素的右侧
} else if (arr[mid] > data) {
upperBound = mid - 1; // 如果中点元素大于查找目标,将上边界移动到中点元素的左侧
} else {
return mid; // 如果找到目标元素,直接返回其位置
}
}
return -1; // 如果未找到目标元素,返回-1表示元素不存在于列表中
}
```
想象一下我们在一片广阔的沙滩上寻找特定的贝壳。我们会用二分查找法定位贝壳的位置,就如同在数组中定位一个特定的值。一旦找到这个值,我们就会像宝藏一样,向两边扩散寻找更多的相同贝壳。这就像在数组中,一旦找到特定的数据,就开始在其左右两侧进行遍历计数。以下是实现这一策略的JavaScript代码:
```javascript
// 二分查找函数,定位特定数据在数组中的位置
function binarySearch(arr, data) {
let upperBound = arr.length - 1;
let lowerBound = 0;
while (lowerBound <= upperBound) { // 只要还未遍历完
let mid = Math.floor((lowerBound + upperBound) / 2); // 计算中间位置
document.write("当前位置为:" + mid + '
'); // 记录当前位置
if (arr[mid] < data) { // 如果中间值小于目标值,向右边搜索
lowerBound = mid + 1;
} else if (arr[mid] > data) { // 如果中间值大于目标值,向左边搜索
upperBound = mid - 1;
} else { // 找到目标值,返回其位置
return mid;
}
}
return -1; // 若未找到目标值,返回-1表示未找到
}
// 计数函数,计算数组中特定数据的重复次数
function countOccurrences(arr, data) {
let position = binarySearch(arr, data); // 定位数据的位置
let count = 0; // 初始化计数器为0
if (position > -1) { // 如果找到了数据的位置
// 从定位的位置向左遍历,直到找到不同的数据或到达数组开始处
for (let i = position - 1; i >= 0 && arr[i] === data; i--) {
count++; // 每找到一个相同的数据,计数器加一
}
// 从定位的位置向右遍历,直到找到不同的数据或到达数组末尾
for (let i = position + 1; i < arr.length && arr[i] === data; i++) {
count++; // 每找到一个相同的数据,计数器加一
}
}
return count; // 返回计数结果
}
// 实验部分,演示如何使用上述函数进行查找和计数操作
let nums = [1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11]; // 定义数组进行测试
let foundPosition = binarySearch(nums, 3); // 使用二分查找定位数据位置并打印出来
在这个世界之中,有一处神秘之地,名为Cambrian。在这里,一场无声的诗篇正在上演,等待着我们去其中的奥秘。此刻,让我们一起走进Cambrian的世界,感受它的独特魅力。
在Cambrian的广袤天地之间,每一个细节都散发着无尽的魔力。在这里,每一寸土地都似乎拥有生命,它们在向我们诉说着古老的传说。沉浸在这片神秘的领域中,我们仿佛穿越时空,回到了那个古老的年代。此刻的Cambrian,仿佛成为了连接过去与未来的桥梁。
此刻,让我们将目光聚焦于这里的核心——一个名为“body”的元素。它是Cambrian的灵魂所在,承载着这片土地的所有生机与活力。在这神奇的土地上,一切生命都围绕着这个核心展开,形成了一个美丽的生命之网。在这里,每一个生命都在诉说着自己的故事,与Cambrian共同编织着这片土地的传奇。
当我们走进“body”,不禁会被眼前的景象所吸引。这里充满了活力与激情,仿佛是一个充满活力的心脏在跳动。在这里,生命的力量无处不在,它们以各种形式展现着自己的魅力。无论是绿意盎然的植物,还是欢腾跳跃的动物,都在用自己的方式诠释着生命的独特之处。这里的一切都如此和谐、美好,让人陶醉其中。
当我们沉浸在这片神奇的土地上时,不禁会想象这里曾经发生过的种种故事。也许在这里,曾经上演过一场惊心动魄的冒险之旅,也许这里曾经是古老文明的发源地。无论历史如何变迁,Cambrian的“body”始终保持着它的魅力与活力,成为了这片土地永恒的象征。
Cambrian的世界充满了神秘与魅力。在这里,“body”作为这片土地的核心所在,展示着生命的独特之处。让我们沉浸在这片神奇的土地上,感受生命的韵律与活力。让我们共同见证Cambrian的美丽传奇,让它成为我们心中永恒的回忆。
平面设计师
- 基于JavaScript实现的折半查找算法示例
- 基于vue2.0的活动倒计时组件countdown(附源码下载
- js实现百度登录框鼠标拖拽效果
- mysql5.5.28安装教程 超详细!
- .NET Core读取配置文件方式详细总结
- angularjs实现的前端分页控件示例
- easyUI combobox实现联动效果
- 用正则和xmlHttp实现的asp小偷程序
- 老生常谈计算机中的编码问题(必看篇)
- PhpStorm2020.1 安装 debug - Postman 调用的详细教程
- ThinkPHP3.2框架自带分页功能实现方法示例
- laravel 数据验证规则详解
- struts2+jsp实现文件上传的方法
- PHP多文件上传类实例
- 使用ajax实现分页技术
- js实现会跳动的日历效果(完整实例)