首页 > 代码库 > 分治法(二分查找)
分治法(二分查找)
给出有序排列的一组数组求出指定元素的下标。
一开始纠结数组奇偶个数,能否查询到首尾。稍加分析后可以发现并不会收到这些因素干扰。
1 // 二分找出其中指定关键字的下标 1,3,5,7,9,13,15,17 2 3 4 5 #include <stdio.h> 6 #include <stdbool.h> 7 8 /****** 递归实现******* 9 int Findmax(int keyNum,const int box[],int size,int left,int right) //传入参数为(关键字,数组,数组大小,左界,右界10 {11 int mid = (left + right) / 2; 12 if(box[mid] == keyNum) //如果中间值 为关键字则直接输出13 {14 return mid;15 }16 else17 {18 19 if(box[mid] > keyNum) //如果中间值大于关键字,将右界改为mid -1 即搜索左半20 {21 return Findmax(keyNum,box,size,left,mid - 1);22 }else23 if(box[mid] < keyNum)24 {25 return Findmax(keyNum,box,size,mid + 1,right); //如果中间值小于关键字,将左界改为mid +1 即搜索右半26 }27 }28 }29 30 31 32 // **************以下循环实现 33 int main ()34 {35 int box[9] = {1,3,5,7,9,11,13,15,17};36 int keyNum = 13;37 38 int left = 0;39 int right = 8;40 int mid;41 while(true)42 {43 mid = (left + right) / 2; //*****此处可以注意优化 44 if(box[mid] == keyNum)45 {46 break;47 }else48 if(box[mid] > keyNum)49 {50 right = mid - 1;51 }else52 left = mid + 1;53 }54 return 0 ; 55 }
注意点在于 mid = (left + right) / 2 可能导致溢出,应该使用 mid = (right - left) / 2 + left 。
分治法(二分查找)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。