二分查找

基本思想

二分查找算法是给出一列按序排列的数字,找到指定的数字。我们用一个例子来举例。0,1,2,3,4,5,6,7,8,9找到数字7。首先定义两个指针index1和index2分别指向数组的头和尾。每次讲index1和index2的数组下标向下取半得到的那个数与目标数对比,若是递增数列当取半的下标数比目标数小将index1指向取半下标,若比目标数大则将index2指向取半下标。若为递减则相反。

  • 将index1和index2的数组下标向下取半得到下标为4,指向4的数比7小,将index1指向下标4。
  • 继续取半得到下标6,比7小将index1指向下标6。
  • 继续取半得到下标7,指向的数是7,找到这个数。
    下面我们来看一道延伸的例题。

例题

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。现在给出一个递增的数组的一个旋转,找到该数组中最小的数{4,5,6,7,8,1,2,3}。
首先我们要知道该旋转数组有两个递增序列,第二个递增数列的第一个数即为最小数。

  • 定义两个指针index1和index2,分别指向数组的头0和尾7。取半 得到下标为3的元素7,7比最后一个元素3大,说明7在第一个递增序列里,将index1指向下标3。
  • 继续取半得到下标为5的元素1,1比3小说明1在第二个递增数列里。将index2指向下标5。
  • 继续取半的到下标为4的元素8,8比3大说明在第一个递增数列里,而8与1的下标只差1,所以8为第一个递增数列的最大数儿后面的1即为最小数。

代码

#include<stdio.h>

int main()
{
    int length;//数组长度
    int a[100];
    int index1,index2,index;
    printf("请输入数组的长度:");
    scanf("%d",&length);
    printf("请输入数组中的元素:");
    for(int i=0;i<length;i++)
        scanf("%d",&a[i]);

    index1=0;
    index2=length-1;
    if(a[index1]<a[index2])//当数组的前0个数旋转时,第一个数即为最小数
      printf("最小数是%d",a[index1]);
    else
    {
      while(index2-index1>1)
     {
        index=(index1+index2)/2;
        if(a[index]>a[length-1])
            index1=index;
        else
            index2=index;
     }
     printf("最小数是%d",a[index2]);
    }
    return 0;
}

截图

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值