新手算法学习之路----二分法

这是我的第一个算法题目,希望通过此方法来要求自己努力进步。

            题目 :二分法的实现

    前提条件:带操作的数组为一个有序的数组。

 基本思想:假设数据是按升序排序的,对于给定值key,从序列的中间位置midlle开始比较,

如果当前位置array[midlle]值等于key,则查找成功;

若key小于当前位置值array[midlle],则在数列的前半段中查找,array[start,midlle];

若key大于当前位置值array[midlle],则在数列的后半段中继续查找array[midlle,end],

直到找到为止,时间复杂度:O(log(n))

    时间复杂度: 假设该数组的长度是N那么二分后是N/2,再二分后是N/4……直到二分到1结束(当然这是属于最坏的情况了,即每次找到的那个中点数都不是我们要找的),那么二分的次数就是基本语句执行的次数,于是我们可以设次数为x,N*(1/2)^x=1;则x=logn,底数是2

     Java主要代码:

 

public int binarySearch(int[] nums, int target) {
        //write your code here
       if (nums == null || nums.length == 0) 
        {
            return -1;
        }

        int start = 0, end = nums.length - 1;
        while (start < end-1) 
        {
            int mid = start + (end - start) / 2;
            if (nums[mid] == target) 
            {
                end = mid;
            }
            else if (nums[mid] < target) 
            {
                start = mid;
            }
            else
            {
                end = mid;
            }
        }
        if (nums[start] == target) {
            return start;
        }else if(nums[end]==target){
            return end;
        }else 
            return -1;
    }

 

 

       遇到的问题:1,分不清到底该怎么while语句里面进行判断。

                          2,刚开始没有设置一个flag, 该found作用是判断已经找到了目标数,而start与end的比较是为了判断是否已经搜索了所有的数据。

 

posted @ 2017-07-05 20:55  JunLiu37  阅读(419)  评论(0编辑  收藏  举报