初探二分算法

又来算法了~~~~

初探二分算法_第1张图片

什么是二分算法?

在计算机科学中,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索

搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

这时候你想到到什么呢?????? 

 猜数游戏           ,你是怎么猜数的呢?

哈哈哈哈~

        此刻于是王五开始答复了,从1开始猜,一直直到结束,这样最好了!!!!

聪明的张三此刻想到,该怎么猜数才能猜的最快呢????

接下来,就会想到,假设在给定范围的中间进行猜测,每次根据得到的值进行判断在中间猜,这样会不会提高效率呢?

接下来演示一下猜数游戏:

我已经想好了一个1-100之间的数了。
请输入一个1到100之间的数:50
你猜的数大了。请输入一个1到100之间的数:25
你猜的数小了。请输入一个1到100之间的数:35
你猜的数小了。请输入一个1到100之间的数:44
你猜的数大了。请输入一个1到100之间的数:40
你猜的数大了。请输入一个1到100之间的数:38
你猜的数小了。请输入一个1到100之间的数:39
你猜的数小了。太好了,你用了7次就猜到了答案。

如果是让你猜这个数,你会怎么猜呢?

        这个刚才所演示的便是二分思想完成猜数游戏的,在这里,我相信大家对二分算法的实现原理已经了然于胸了;但是还的继续,你越爱它,它便会越爱你!!!初探二分算法_第2张图片


 java代码实现二分原理

二分法时针对于已经排序的数组

package mazi;

public class BinarySearch {
    public static int binarySearch(int[] arr, int start, int end, int hkey){
        int result = -1;
        // 进行二分查找
        while (start <= end){
            int mid = start + (end - start)/2;    //防止溢位
            if (arr[mid] > hkey)
                // 让下标从中间向左
                end = mid - 1;
            else if (arr[mid] < hkey)
                // 让起始下标右移动
                start = mid + 1;
            else {
                result = mid ;
                break;
            }
        }
        return result;
    }

    public static void main(String[] args) {
        int [] arr = {1,2,3,4,5,6,7,8,9,10};
        int res = binarySearch(arr,0,arr.length-1,10);
        System.out.println("res="+res);
    }
}

代码是怎么运行的呢??

初探二分算法_第3张图片

{1,2,3,4,5,6,7,8,9,10};

初下标(左侧的起始下标) + (末下标 - 初下标) / 2

第一轮                mid=4    start=0    end=9                mid = 0 + ( 9 - 0)/2;
第二轮                mid=7    start=5    end=9                mid = 5 + ( 9- 5) /2;
第三轮                mid=8    start=8    end=9                mid = 8 + (9 - 8 ) /2;
第四轮                mid=9    start=9    end=9                mid = 9 + (9 - 9) /2;

初探二分算法_第4张图片

 感谢阅读,欢迎大家留言~~~

你可能感兴趣的:(二分算法,java)