基本思想:
//待查记录的顺序为从小到大
- 首先将待查元素的关键字(key)值与待查记录中间位置上上(下标为mid)记录的关键字进行比较,若相等,则查找成功
- 若 key>r(mid).key,则说明待查记录只可能在后半部分[mid+1,N-1]中,下一步应在后半部分中查找
- 若key< timid). key,说明待查记录只可能在前半部分[0,mid-1]中,下一步应在r的前半个部分中查找
- 重复上述步骤,逐步缩小范围,直到查找成功或待查记录为空失败时为止。
注意:中间值位置求出若为小数,应向下整,即4.5=4,非四舍五入;中间值己经比较过不相等,在划分下一次比较区间时,无需将中间值位置再纳入下一次比较区间;待查记录必须已排好序
时间复杂度为O(log2n)
#define N 10
//对顺序为从小到大的数组进行折半查找
int arr[] = {1,2,3,4,5,6,7,8,9,10};//待查找数组
int low = 0;//数组下标最小
int high = N-1;//数组下标最大
int key = 0;//带查找元素
int mid;//中间变量
while(low <= high){
mid = (low + high)/2;
if(key < arr[mid]){
high = mid -1;
}
else if(key == arr[mid] ){
printf(“%d”,mid+1);
return 0;
}
else{
low = mid +1 ;
}
}
printf(“未查找到”);
#define N 10
//对顺序为从大到小的数组进行折半查找
int arr[N] = {10,9,8,7,6,5,4,3,2,1};//待查找数组
int low = 0;//数组下标最小
int high = N-1;//数组下标最大
int key = 0;//带查找元素
int mid;//中间变量
while(mid = (low + high)/2 ){
if(key > arr[mid]){
high = mid -1;
}
else if(key == arr[mid] ){
printf(“%d”,mid+1);
return 0;
}
else{
low = mid +1 ;
}
}
printf(“未查找到”);