数据结构知识点练习题——折半查找

本文介绍了如何在有重复数字的有序数组中使用折半查找算法找到第一个大于等于目标值的元素位置。通过非递归和递归两种方式讲解代码实现,并提供了示例输入输出。

数据结构知识点练习题——折半查找

请实现有重复数字的有序数组的二分查找。
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一

输入:
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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值