二分算法实现

二分算法应该使用下标还是元素个数进行二分

首先要明白,二分是对数据个数进行二分还是对下标进行二分。

答案是:既然分,那肯定是对数量进行分量,所以二分是对元素个数的二分。

int arr[10];

void find(int arr[],int index,int size)
{
    //二分法结束条件:只剩下一个数据进行二分,即size/2=0
    if(size/2==0) return;
    if(index

下标和二分所得数据的比较

下标:   0  1  2  3  4 | 5    6    7    8    9  

元素:   1  3  5  7   9 |11  13  15  17  19

                          5个  |  5个

可见:二分之后,左边下标最大值总比元素个数小1,二分数据是右边数据的第一个元素的下标。 

二分和下标分三种情况:

1:只有一个元素或者没有元素:

2,大于等于两个以及两个以上才进行二分:

                        if(index==0)
                                return first;
                        else if(index==(size-1))
                                return last;
                        else if(index* curr=first;
                                for(int i=0;inext;
                                }
                                return curr;
                        }else
                        {
                                node* curr=last;
                                for(int i=size-1;i>=index;--i)//一定指向倒数第二个了
                                {
                                        curr=curr->prev;//先指向,再i--的
                                }
                                return curr;
                        }

注意

1,获取最右边下标时,记得减1---right=nums.size()-1;

2,两个边检值也可能相等,

3,当比较了边界值之后,把中间下标赋给边界时,因为中间下标已经比较了,所以先加1或者减1 再赋值,

中间下标值有两种情况,应该要怎么获取:

int mid = (high - low) / 2 + low;

(9-0)/2+0=4.5

int--->4

因为:

不是找中位数,所以只要在中间,前一点后一点没关系。

int search(vector& nums, int target) {
        int left=0,right=nums.size()-1,mid;
        while(left<=right)
        {
            mid=(right-left)/2+left;
            if(nums[mid]==target) return mid;
            if(nums[mid]

子函数能不见就不建,调用花费时间。

你可能感兴趣的:(算法)