码迷,mamicode.com
首页 > 其他好文 > 详细

简单但实用的二分法(一)

时间:2014-07-09 22:17:39      阅读:286      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   数据   问题   

二分法,作为一个c的初学者,基本上是都要学的,简述一下二分的思想,比如说给你10个数:1,3, 5, 4, 6, 10, 9, 8, 7, 2.让你查找其中的一个数,比如2,最容易想到的方法就是从第一个数到最后一个数遍历一遍。

for(i = 0; i < n; i++)
{
      if(a[i] == m)
       break;
}
.........

但这样是有问题的,如果n的值很大,大到1000000,,10000000,这样就明显不行,会超时。那怎么办呢?这就轮到我们的二分法出场了。

二分法,顾名思义,每次把所有数据分成两半。当然,用二分法的一个重要前提就是数列必须是有序的。也就是说,如果题目给你的数列是无序的话,必须要先给它排序才能使用二分(排序的话建议使用sort函数,可以百度到),还是那10个数,排序完之后就是:1, 2, 3, 4, 5, 6, 7, 8, 9,10。每次取中间值(mid),比如说还是找2,第一次mid = (1 + 10)/2= 5,2 < 5,所以就取区间1~5,再取mid = (1 + 5)/2 = 3,3 > 2,就再取区间1~3,再执行前面的操作就得到了要找的数2,。这样只要三次就找到了2,而第一种要找10次。对于二分来说,因为每次都是取其一半,所以1000000个数也就只要n = log1000000,也就差不多20多次。这就比一般的查找法快了很多吧。

while(l < r)    //l为左边界,r为右边界
{
      mid = (l + r) / 2;  //取中间值
      if(  mid > x )          //更新边界,画图可以理解,x为要找的值
      {
               r = mid;
       }
       if( mid < x )
      {
               l = mid;
       }
       if(mid == x)
       {
             printf("已找到该数");
        }
}
printf("未找到该数");

 

简单但实用的二分法(一),布布扣,bubuko.com

简单但实用的二分法(一)

标签:style   blog   color   使用   数据   问题   

原文地址:http://www.cnblogs.com/yihuayishijie/p/3829675.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!