排序系列三: 二分查找法
Hello,大家好,今天给大家继续讲解排序系列。可能有细心的"鸟友"会问,你不是讲解排序吗?怎么今天的主题是一个查找方法咧?
不错,因为考虑到在实际项目中,排序和查找经常是两个好基友,二者息息相关,相互依存。故为了大家更好的接手老板交给你的实际工作,而不至于被说成是"新兵蛋子",我觉得大家有必要和我来学学这个查找法。
言归正传,首先假定一个有序整数序列存储在数组list[MAX]中,即list[0]<list[1]l<...<list[MAX-1];我们要查找的数为num_search令 1eft、 right分 别 表 示 表 中 待查序列的左右端 点 ,初 值 分别为:left=0,right=MAX-1。再令 middle=(left+right)/2,为序列表 的 中间值 。 num_search和 list[middle]比较的 结果 ,有三种可能 :
(1)num_search<list[middle].此 时 ,如 果 num_search在 表 中 ,它一定 在 位 置0与midde-1之间 ,因此 ,把 right设成 middle-1.
(2) num_search==list[middle]。 此 时 , middle所指位置就是要找的数,函数返 回midd1e。
⑶ num_search>list[middle]。 此 时 ,如 果 searchnum在 表 中 ,它一定 在 位 置midde+1与MAX-1之间 ,因此 ,把 left设 成 middle+1.
为了程序的简洁和兼容性,这种比较可以定义一个比较宏COMPARE(x,y)来实现.
当 num_search还没被找到,同时尚有没检查到的其它整数,则我们重新计算 middle,重 复上述查找过程。
接下来的程序是具体实现这种查找策略。程序实现了由用户自行设置序列个数LEN,然后由随机数生成函数生成各元素,采用上节课讲的选择排序算法将序列转换成由小至大排列的有序序列。
最后就是今天的算法关键啦☞《二分查找法》
包括两个子任务:
(1)表中是否还有未查找过的整数
(2)比较 num_search和 list[middle]。
(3)递归调用
无图无真相!