<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
console.time();
let arr = []
for (let i = 0; i < 100000000; i++) {
arr.push(i)
}
let j = 50000000
// 遍历法
// for (let k = 0; k < arr.length - 1; k++) {
// if (arr[k] == j) {
// console.log('找到了,下标是%d\n', k)
// }
// }
// 二分法非递归
// var search = function (nums, target) {
// let low = 0,
// high = nums.length - 1; // 下标
// while (low <= high) {
// const mid = Math.floor((high - low) / 2) + low;
// const num = nums[mid];
// if (num === target) {
// return mid;
// } else if (num > target) {
// high = mid - 1;
// } else {
// low = mid + 1;
// }
// }
// return -1;
// };
let search2 = function (nums, target) {
//当数组有0个或者1个元素时做特殊处理
if (nums.length == 0) {
return -1;
}
if (nums.length == 1) {
if (nums[0] == target) {
return 0;
} else {
return -1;
}
}
let m = parseInt(nums.length / 2);
//如果选取的数组的中间元素比目标大,则截取从0到这个中间元素构成一个新数组
//返回最终的递归结果
if (nums[m] > target) {
let arr = nums.slice(0, m);
return search(arr, target);
} else if (nums[m] < target) {
//如果小于目标元素则截取后面的,如果递归最终找到了,那么要返回找到的下标值加前面的才是我最终数组的下标,
//如果没找到就直接返回-1
let arr = nums.slice(m, nums.length);
if (search(arr, target) == -1) {
return -1;
}
return search(arr, target) + m;
//递归的出口,如果找到了返回对应下标,没找到返回-1
} else if (nums[m] == target) {
return m;
} else {
return -1;
}
}
console.log("结果索引", search2(arr, j));
// console.log("结果索引", search(arr, j));
console.timeEnd();
</script>
</body>
</html>
javascript遍历、二分查找性能对比
最新推荐文章于 2024-05-23 23:33:04 发布