给出有序排列的一组数组求出指定元素的下标。
一开始纠结数组奇偶个数,能否查询到首尾。稍加分析后可以发现并不会收到这些因素干扰。
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 else 17 { 18 19 if(box[mid] > keyNum) //如果中间值大于关键字,将右界改为mid -1 即搜索左半 20 { 21 return Findmax(keyNum,box,size,left,mid - 1); 22 }else 23 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 }else 48 if(box[mid] > keyNum) 49 { 50 right = mid - 1; 51 }else 52 left = mid + 1; 53 } 54 return 0 ; 55 }
注意点在于 mid = (left + right) / 2 可能导致溢出,应该使用 mid = (right - left) / 2 + left 。
时间复杂度 O(logn)