二分查找法(Java)

前言:

二分查找法有两个先决条件:

  1. 采用顺序存储结构
  2. 按关键字有序排列

这里分两种要求:

要求1:

  • 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。
    实现:
import java.util.*;

public class BinarySearch {
    public int getPos(int[] A, int n, int val) {
        // write code here
        if (n <= 0) {//如果数组长度为0
            return -1;
        }
        if (n == 1) {//如果数组长度为1
           if (A[0] == val) {
               return 0;
           }else {
               return -1;
           }
         }
        int left = 0;//左侧索引
        int right = n-1;//右侧索引
        int mid = 0;
        while (left <= right) {//注意这里是小于等于
            mid = left + (right-left)/2;//取中间的值
            if (val == A[mid]) {//如果相等,则返回索引位置
                return mid;
            }else if (val > A[mid]){ //如果大于,则选择右边半部分继续比较
                    left = mid+1;
            }else{//如果小于,则选择左边半部分继续比较
                    right = mid-1;
                }
        }
        return -1;
    }
}

要求2:

  • 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
    实现:
import java.util.*;

public class BinarySearch {
    public int getPos(int[] A, int n, int val) {
        if (n <= 0) {//如果数组长度为0
            return -1;
        }
        int left = 0;//左侧索引
        int right = n-1;//右侧索引
        int mid = 0;
        while (left < right) {//注意这是小于
            mid = left + (right-left)/2;
            if (val == A[mid]) {//如果等于中间值,则将mid的索引值赋给right,继续比较以来寻找到val第一次出现的位置
                right = mid;//这是重点
            }else if (val > A[mid]){//如果大于,则选择右边半部分继续比较
                    left = mid+1;
            }else{//如果小于,则选择左边半部分继续比较
                    right = mid-1;
                }
        }
        if (A[left] == val) {//如果最后left所在的值等于val,则说明val第一次出现的索引位置为left
            return left;
        }
        return -1;
    }
}

猜你喜欢

转载自blog.csdn.net/zm13007310400/article/details/78333183