0
点赞
收藏
分享

微信扫一扫

Java基础_查找和排序

夹胡碰 2022-01-20 阅读 47

Java基础_目录

点击查看

J.1 二分查找

在这里插入图片描述
需求:查找数字126

正常的查找:
从索引0开始一个一个的查找,先看索引0对应的元素是不是126,发现不是,然后查看索引1对应的元素是不是126,发现也不是,然后一直往后查找,直到找到索引为31的的元素才找到,一共找了32次才找到要找的元素,效率很低

J.1.1 什么是二分查找

二分查找:
要求:有序的数组
在这里插入图片描述
步骤:
1.确定搜索的范围,最开始是0-31,将126与中间位置的元素进行比较,发现126比该中间元素大,也说明该元素左边的所有元素都小于126
在这里插入图片描述
2.接下来只要在右边范围的元素中再次按照步骤1查找
在这里插入图片描述
3.以此类推,第5次时查找到了最终的元素
在这里插入图片描述

J.1.2 手写二分查找

Floor向下取整
在这里插入图片描述
代码示例:

package com.peppacatt.springboottest.interview;

import org.junit.jupiter.api.Test;

import java.util.Arrays;

/**
 * 二分查找
 */
public class BinarySearch {


    @Test
    public void myMain() {
        int[] arr = {1, 4, 7, 24, 88, 22, 72};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
        System.out.println(binarySearch(arr, 24));
    }

    /**
     * 二分查找
     *
     * @param arr 有序的数组
     * @param num 要查找的数字
     * @return 数组的索引值,-1表示未找到
     */
    public int binarySearch(int[] arr, int num) {
        int l = 0;
        int r = arr.length - 1;
        while (l <= r) {
            int m = (l + r) / 2;
            if (arr[m] < num) {
                l = m + 1;
            } else if (arr[m] > num) {
                r = m - 1;
            } else {
                return m;
            }
        }
        //返回-1表示未找到
        return -1;
    }

}

执行测试类结果:
在这里插入图片描述

J.1.3 解决整数溢出

问题:
在执行l+r时如果r是最大int值,可能会导致整数溢出
比如:此时要查找的元素在m右边, m+1+r就超出了int值的最大值(变成负数了)
在这里插入图片描述

解决方法一:
将(r+l)/2替换为: l+((r-l)/2)

在这里插入图片描述

解决方法二:
使用右移运算>>>,这种方法效率更高
在这里插入图片描述

举报

相关推荐

0 条评论