二分查找的变形问题

二分查找的变形问题思想

1:第一种想法:我们首先找到待查找值在数组中的位置,然后根据条件向前 或后索引看是否也等于该值。
num[i]==value我们再根据条件判断num[i-1]==value or num[i+1]=value这也来查找。
2:第二种想法:主要就是我们要如何让low and high收敛到目标位置上。这个就根据我提供我程序来看吧,写的比较啰嗦,小白笔记。

在一个有序的数组中查找第一次出现某个值的位置。

void find1(int *num)
{
	int low=0;
    int high=MAXSIZE-1;
    int value,mid=0;
    printf("请输入你要查找的元素:");
    scanf("%d",&value);
    while(low <= high)
    {
        mid=low+((high-low)>>1);//这里相当于除以2
        if(num[mid]>=value)
        {
            high=mid-1; //如果等号取到了,因为我们不知道这个是不是第一次出现的,所以我们需要看它的前面一个元素
        }
        else
        {
            low=mid+1;//这里可以让其收敛到第一个出现value的位置上
        }
    }
    if(num[low]==value && low<10 && high >=0)
        printf("%d第一次出现在数组下标为%d的位置\n",value,low);
    else
        printf("%d不在数组中\n",value);
}

在一个有序数组中查找某个值最后一次出现在数组中的下标。

void find2(int *num)
{
    int low=0;
    int high=MAXSIZE-1;
    int value,mid=0;
    printf("请输入你要查找的元素:");
    scanf("%d",&value);
    while(low <= high)
    {
        mid=low+((high-low)>>1);//这里相当于除以2
        if(num[mid]<=value)
        {
            low=mid+1; //如果等号取到了,因为我们不知道这个是不是第一次出现的,所以我们需要看它的后面一个元素
        }
        else
        {
            high=mid-1;//这里可以让其收敛到最后一次出现value的位置上
        }
    }
    if(num[high]==value && high>=0 && low<10)
        printf("%d第一次出现在数组下标为%d的位置\n",value,high);
    else
        printf("%d不在数组中\n",value);
}

在一个有序数组中,查找第一个大于给定元素的值

void find3(int *num)
{
    int low=0;
    int high=MAXSIZE-1;
    int value,mid=0;
    printf("请输入你要查找的元素:");
    scanf("%d",&value);
    while(low <= high)
    {
        mid=low+((high-low)>>1);//这里相当于除以2
        if(num[mid]>value)
        {
            high=mid-1; 
        }
        else
        {
            low=mid+1;//这里可以让其收敛到目标位置
        }
    }
    if(num[low]>value && low<10 && high>=0)//因为是第一次出现大于value的位置。这里还需要加上边界条件的判断
        printf("第一次出现大于%d,在数组下标为%d的位置\n",value,low);
    else
        printf("不存在大于%d的数组元素\n",value);
}

在一个有序数组中,查找最后一个小于给定元素的值。

void find4(int *num)
{
    int low=0;
    int high=MAXSIZE-1;
    int value,mid=0;
    printf("请输入你要查找的元素:");
    scanf("%d",&value);
    while(low <= high)
    {
        mid=low+((high-low)>>1);//这里相当于除以2
        if(num[mid]<value)
        {
            low=mid+1; 
        }
        else
        {
            high=mid-1;//这里可以让其收敛到目标位置
        }
    }
    if(num[high]<value && low <10 && high>=0) //因为是最后一一次小于value的情况
        printf("最后一次出现小于%d,在数组下标为%d的位置\n",value,low);
    else
        printf("不存在小于%d的数组元素\n",value);
}

num是我们传入的一个数组,在里面进行查找。
注意:二分查找适合数据量较大的查找,对于数据量不大的话,其实顺序查找跟二分查找差不多,而且顺序查找还对数据要求没有这么的严格,即使不是有序的也不会影响。但是二分查找就不可以。
最后在上面提供的程序中没有写主函数,可以自己给定


版权声明:本文为shumona原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。