二分查找

来源:互联网 发布:python 2.x.msi 编辑:程序博客网 时间:2024/06/14 03:35

基本思想

二分查找算法是给出一列按序排列的数字,找到指定的数字。我们用一个例子来举例。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