二分讲解

二分概述


12.2.1 基本定义


二分法又称分半法,或对分法,是一种方程式根的近似值求法.一般在计算机竞赛中经常使用,为基础算法。二分法有经常做为许多算法的优化途径,可以使一些0(n)的算法优化成0(log(n))


12.2.2 基本思想


二分法的思想:分而治之。将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同,(如果子问题的规模仍然不够小,则再划分为k个子问题), 然后递归的求解这些子问题,最后用适当的方法将各子问题的解合并成原问题的解。

 

12.2.3 基本特征


二分法所能解决的问题一般具有以下几个特征:

(1)该问题的规模缩小到一定的程度就可以容易地解决

(2)该问题可以分解为若干个规模较小的相同问题

(3)该问题所分解出的各个子问题是相互独立的

(4)利用分解出的子问题的解可以合并为该问题的解


12.2.4 二分搜索算法介绍


前提条件:有一组数已经按从小到大(或从大到小)排序

目标:输入一个数x,在这组数查找是否有x

 

二分搜索的步骤:

确定三个关键下标的初值:bott=0, top=8, mid=(bott+top)/2;

判断要找的数x是否等于a[mid] 

x==a[mid]   找到,结束

x<a[mid]   a[bott]—a[mid-1]之间继续查找x

                top=mid-1;  mid=(bott+top)/2;

③ x>a[mid]  a[mid+1]—a[top]之间继续查找x

                bott=mid+1;  mid=(bott+top)/2; 

二分实例介绍:设在数组a中顺序放了以下9个元素:

 

检索x=9Left=0,right=8,mid=(left+right)/2=4;


 

 9==a[4], 一次比较就成功, 最好情况。

检索x=-15Left=0,right=8,mid=(left+right)/2=4;

 

 -15<a[4],right=mid-1=3,mid=(left+right)/2=1;

 

 -15<a[1]Left=0,right=mid-1=0,mid=(left+right)/2=0;

 

 -15==a[0], 3次比较, 成功

二分查找代码:

#include<stdio.h>
#define  N  10
int a[N];
int find(int x, int left, int right)
{
  while(left<=right)
  {
    int mid=(left+right)/2;
    if(a[mid]==x)
      return mid;
    else if(a[mid]>x)
      right=mid-1;
    else left=mid+1;
  }
  return -1;
}
int main( )
{
  int x,index;
 	 printf("请从小到大输入10个数\n");
  for(int i=0;i<N;i++)
    scanf("%d",&a[i]);
  	printf("请输入需要查找的数x\n");
    scanf("%d",&x);
    index=find(x,0,N);
    if(index==-1)
      printf("%d is no found!\n",x);
    else
      printf("find %d==a[%d] !\n",x,index);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值