二分法扩展——就近查找
二分查找拓展问题
设计算法,在正序排列数组L中查找元素x,
输出x或最接近x(如果不存在的话)的元素下标。
1 #include <stdio.h> 2 int Binary_search(int array[], float x, int left, int right); 3 int main(int argc, const char *argv[]) 4 { 5 int a[10] = {-1,3,5,6,7,8,9,12,13,17}; //整数数组 6 int left = 0; 7 int right = 9; 8 float x; 9 scanf("%f",&x); 10 int flag = Binary_search(a,x,left,right); 11 printf("%d\n",flag); 12 return 0; 13 } 14 int Binary_search(int array[], float x, int left, int right) 15 { 16 int mid = (right+left)/2; //计算中值点 17 if (left > right) //未查找到,判断。 18 { 19 if (right < 0) //x比array[0]小时 20 return array[0]; 21 int double_average = array[right]+array[left]; //x比array[0]大时 22 if (double_average < 2*x) //array[left]和array[right]的平均数和x比较 23 return array[left]; //防止精度缺失,故采用乘法 24 else if (double_average > 2*x) 25 return array[right]; 26 else 27 { 28 printf("%d\t",array[left]); //array[left]和array[right]的平均数就是x时 29 return array[right]; 30 } 31 } 32 if (x == array[mid]) //查找到,返回。 33 return array[mid]; 34 else if (x < array[mid]) //左端查找 35 return Binary_search(array,x,left, mid-1); 36 else //右端查找 37 return Binary_search(array,x,mid+1,right); 38 }
//整数数组