"二分法"-"折半法"-查找算法-之通俗易懂,图文+代码详解-java编程


1.特点及概念介绍

    下面给大家讲解一下"二分法查找"这个java基础查找算法,那么什么是二分法呢?其实所谓的"二分法",就是一分为二的意思,综合起来理解就是一分为二的查找,但大家记住了,二分法是建立在"已经按顺序排好"的基础条件上,如果大家把这个二分法查找理解清楚了,那么会有助于你更好的理解快速排序,下面我就罗列出该算法的特点:

    1.定义起始位置start(0角标),定义末位置end(lenght-1位置,即最后一位)
    2.无限循环的查找一个值,先看看该值是不是在中间mid角标,mid=(star+end)/2
    3.如果该值大于mid角标对应值,那么start变成mid的右边一位,如果小于,那么end就变成mid的左边一位,这样会极其的高效.
    5.找到值就返回值或打印,找不着也返回-1或打印,并停止循环.

2.图文描述过程

这里写图片描述


现有需求:
1.有一个已经排列好顺序的从小到大的数组.
2.请查询一个数字所在的角标位置.
3.如果元素不存在,请给出如果插入,那么应该插入的位置.

3.代码详情

public class Demo04 {
    public static void main(String[] args) {
        int[] ints = { 1, 3, 5, 7, 9, 11, 14 };
        find(ints, 3);
        find(ints, 14);
        find(ints, 6);
    }
    /**
     * 如果找不到,那么求应该插入的位置
     */
    private static void find(int[] ints, int i) {
        // int index = Arrays.binarySearch(ints, i);
        // System.out.println(index);//找不到返回负数
        int start = 0;
        int end = ints.length - 1;

        while (true) {
            int mid = (start + end) / 2; // 注意中间是两者之和的一半
            if (i == ints[mid]) {
                System.out.println("index = " + mid);// 正好找到打印角标,停止;
                break;
            } else {
                if (i < ints[mid]) {// 小于中间值,那么end变成中间往中间往左一位
                    end = mid - 1;
                } else {// 大于则相反
                    start = mid + 1;
                }
            }
            // 交叉了-即找不到情况,说明start在0或者尾部或者在交叉时的前一位,那么得到应该插入位置;
            if (start > end) {
                // 找到了前面一个start,并确定在此即可;
                System.out.println("no find, will insert in :" + start);
                break;
            }
        }
    }

输出结果(分别找3,找14,找6)

index = 1
index = 6
no find, will insert in :3

4.总结:

二分法查找,又称折半查找,大家需要记住的重点有

1.已经排序好的数组
2.确定最左边的start,最右边的end
3.无限循环当中找mid角标对应的值,start和end会根据情况改变
4.当发现start和end交叉,那么证明找不到,即如果放入该元素,那么就应该放在此时的start位置.

这就是今天给大家讲的二分(折半)查找算法,希望能帮组大家快速的理解清楚.

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是Dev-C++实现顺序查找算法二分法查找算法的示例代码: ```c++ #include <iostream> #include <vector> #include <algorithm> using namespace std; // 顺序查找算法 int seqSearch(vector<int>& nums, int target) { for (int i = 0; i < nums.size(); i++) { if (nums[i] == target) { return i; } } return -1; // 查找失败 } // 二分法查找算法 int binarySearch(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1; while (left <= right) { int mid = (left + right) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; // 查找失败 } int main() { vector<int> nums = {3, 5, 2, 8, 4, 7, 1, 6}; sort(nums.begin(), nums.end()); // 二分法查找算法需要有序表 int target = 4; int index1 = seqSearch(nums, target); // 调用顺序查找算法 int index2 = binarySearch(nums, target); // 调用二分法查找算法 if (index1 != -1) { cout << "顺序查找成功,目标元素下标为:" << index1 << endl; } else { cout << "顺序查找失败,未找到目标元素" << endl; } if (index2 != -1) { cout << "二分法查找成功,目标元素下标为:" << index2 << endl; } else { cout << "二分法查找失败,未找到目标元素" << endl; } return 0; } ``` 以上代码中,我们使用了STL中的vector容器来存储顺序表元素,并使用sort函数对其进行排序,以便二分法查找算法能够正确执行。在main函数中,我们分别调用了顺序查找算法二分法查找算法查找目标元素的值为4。最后,根据返回的下标值,输出查找结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值