赞
踩
问题1:假设有一个有序数组arr[] = {1,3,4,6,9,11,15},用二分的方式找其中的数值11。
二分的意思就是把数组一分位二,当前数组的中点位置的下标为:(0 + 7)/2 = 3 的位置;
分为a1数组{1,3,4,6} (下标从 0 - 3)和 a2数组{9,11,15}(下标从 4 - 6),显然a1数组的终点6小于要查找值11,所以a1数组中不可能存在,
再次二分a2数组,此中点位置的下标(4+7)/2=5,分为数组b1{9,11}(下标从4 - 5), 和 数组b2{15}(下标从 6 - 6),b1的终点位置值等于11,直接取出。
public class BinarySearch { public static void main(String[] args) { int[] arr = { 1,3,4,6,9,11,15}; System.out.println(find(arr,11)); } /** * 二分查找num 是否存在 数组arr中 * @param arr * @param num * @return */ public static boolean find(int[] arr,int num){ if(null == arr || arr.length == 0){ return false; } // 先定义左右边界,因为无法直接去掉一半,所以先给定左边界为 0 有边界为arr.length-1 int L = 0; int R = arr.length - 1; //while 实现每次取一半查找 while (L < R){ //定义中点位置, int mid = (L + R)/2; if(arr[mid] == num){ // 如果等于num 说明已找到 ,返回true return true; } // 上面判断跳过,说明arr[mid] 不等于 num, //判断 中点位置 arr[mid] 如果 大于 num,说明 右边界 mid - R 位置的值 大于 num,num 存在 左边界 L - mid 位置 // 将右边界 R 设置为 mid-1 else if(arr[mid] > num){ R = mid - 1; } //中点位置 arr[mid] 如果 小于 num,说明 左边界 L - mid 位置 小于 num,num 存在 右边界 mid - R 位置的值 // 将 左边界 L 的 位置 设置为 mid+1. else{ // if(arr[mid] < num){ L = mid + 1; } } return false; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。