二分查找法

Posted 程序设计及计算机基础学习空间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找法相关的知识,希望对你有一定的参考价值。


  

二分查找法又称折半查找法,优点是比较次数少,查找速度快,平均查找性能好;其缺点是要求待查找的数据是有序的,且插入和删除时需移动大量数据。


假设一组有序数据(升序)存放在一维数组a中,采用二分查找法查找数据k的基本思想是:


将a数组中间位置的元素与待查找数k比较,如果两者相等,则查找成功;否则利用数组中间位置数据将数组分成前后两块,当中间位置的数据大于待查找数据k时,则下一步从前面一块查找k;当中间位置的数据小于待查找数据k时,下一步从后面一块查找k;重复以上过程,直至查找成功或失败。


下面两张图给出了用二分查找法查找数据22、45的具体过程,其中mid=(low+high)/2,a[mid]表示数组中间位置的数据,当a[mid]>k时,修正high=mid-1;当a[mid]<k时,修正low=mid+1;当a[mid]=k时,表示查找成功;当high<low时,表示查找失败。初始状态:low=0,high=N-1。


当删除数据时,则该数据后面的数组元素往前移一位。


当插入数据时,则首先找到该数据插入的位置,并从最后一个数据元素开始向后移一位,直到空出该位置以作插入数据之用。


二分查找法



二分查找法



【编程示例】


从键盘输入N个有序整数,然后采用二分查找法在其中查找数据k,若找到,显示查找成功的信息,并将该数据删除;若没有找到,则将数据k插入到这些数中,插入操作后数据仍然有序。


源程序:


#include <stdio.h>

#define N 8

int main(void)

{

  int a[N+1],k,i,low,high,mid;

  int point;

  printf("Please enter %d order data:",N);

  for(i=0;i<N;i++)

     scanf("%d",&a[i]);   //按从小到大的顺序输入数据

 printf("Please enter the number to be located:");

 scanf("%d",&k);   //输入要查找的数据

 low=0;   high=N-1;

 while(low<=high)  //二分查找

 {

    mid=(low+high)/2;

    if(a[mid]==k)

      {   point=mid;    //记录查找值的位置

          break;

      }

   else if(a[mid]<k) low=mid+1;

          else high=mid-1;

 }

 if(low<=high)   //如果查找成功则删除数据

 {

    printf("The index of data is: %d,Now delete it. ",point);  //显示查找值的下标

    for(i=point;i<N;i++)   //删除数据

          a[i]=a[i+1];

    for(i=0;i<N-1;i++)

          printf("%4d",a[i]);

    printf(" ");

 }

 else              //如果查找失败则插入数据

   {

      printf("The data is not in the array! Now insert. ");

      i=N-1;

     while(i>=0 && a[i]>k)    //查找并空出插入数据的位置

       {

          a[i+1]=a[i];

           i=i-1;

        }

      a[++i]=k;        //插入数据

      for(i=0;i<=N;i++)

          printf("%4d",a[i]);

       printf(" ");

     }

  return 0;

}


运行结果为:(查找成功删除数据


Please enter 8 order data: 23 45 67 89 96 98 123 125↙

Please enter the number to be located: 89↙

The index of data is: 3 , Now delete it.

    23  45  67  96  98  123  125


运行结果为:(查找失败,插入数据)


Please enter 8 order data: 23 45 67 89 96 98 123 125↙

Please enter the number to be located: 70↙

The data is not in the array! Now insert.

    23  45  67  70  89  96  98  123  125






以上是关于二分查找法的主要内容,如果未能解决你的问题,请参考以下文章

java 二分查找法

二分查找法以及拉格朗日插值查找法

冒泡排序,递归二分查找法,二分查找法

二分查找法 冒泡排序法

二分查找算法

算法篇——二分查找法(折半查找法)