首页 > 代码库 > 简单但实用的二分法(一)

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

二分法,作为一个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("未找到该数");