首页 > 代码库 > 简单但实用的二分法(一)
简单但实用的二分法(一)
二分法,作为一个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 = log21000000,也就差不多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("未找到该数");
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。