数据结构知识点练习题——折半查找
请实现有重复数字的有序数组的二分查找。
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一
输入:
5,4,[1,2,4,4,5]
输出:
3
折半查找原理:(自己查百度吧)
好了,说代码:
在这里插入代码片
//验证数据
//2,3,4,4,4,7,7,8,10,10,11,12,13,14,15,15,17,18,19,23,24,24,24,24,25,26,26,26,27,27,28,
//29,29,30,33,36,38,38,40,40,41,43,43,43,44,46,46,47,51,52,52,53,54,56,57,57,57,58,58,61,61,61,62,
//64,64,66,66,67,67,67,70,72,74,74,74,75,75,78,78,78,79,79,80,83,83,83,83,84,84,86,88,89,89,90,91,91,92,93,93,96
var n = prompt('请输入数组长度:');
var v = prompt('请输入要查找的数字:');
var a = prompt('请输入要查找的数组:');
a = a.split(',');
var height = parseInt(n)
var low = 0;
v = parseInt(v)
//递归查找不适合查询太大的数组
//102ms
// 运行时间
//18196KB
// 占用内存
function getMax(arr, low, height, k) {
if (low > height || arr[height] < k) {
return height + 1
} else {
var mid = Math.floor((height + low) / 2);
if (arr[mid] >= k && arr[mid - 1] < k) {
console.log(mid);
return mid + 1;
} else if (arr[mid] >= k && arr[mid - 1] >= k) {
console.log(mid);
return getMax(arr, low, mid - 1, k)
} else {
console.log(mid);
return getMax(arr, mid + 1, height, k)
}
}
}
console.log(getMax(a, low, height, v));
//非递归方法
//106ms
//运行时间
//17664KB
//占用内存
function getMax_(arr, n, v) {
if (arr[n - 1] < v) {
return n + 1
}
let height = n;
let low = 0
while (low <= height) {
var mid = Math.floor((height + low) / 2);
if (arr[mid] >= v) {
if (arr[mid - 1] && arr[mid - 1] >= v) {
height = mid - 1
} else {
return mid + 1
}
} else {
low = mid + 1
}
}
}
console.log(getMax_(a, height, v));
总结:可以用普通的非递归方式编写,容易理解,代码可读性也高;用递归方式编写,理解难度有一点,最主要是这样可以让别人问你(hhh)
本文介绍了如何在有重复数字的有序数组中使用折半查找算法找到第一个大于等于目标值的元素位置。通过非递归和递归两种方式讲解代码实现,并提供了示例输入输出。
2040

被折叠的 条评论
为什么被折叠?



