算法设计实验二
实验二 二分查找
问题描述
给定已按升序排好序的 n 个元素 a[0 : n-1] ,现要在这 n 个元素中找出一特定元素 x。
基本思想是:将 n 个元素分成大致相同的两半,取 a[n/2] 与 x 相比较:
- 如果 a[n/2] == x,则找到,算法终止;
- 如果 a[n/2] < x,则在数组的左半部继续搜索;
- 如果 a[n/2] > x,则在数组的右半部继续搜索。
下图描述了寻找 x = 88 的过程:

参考实现
#include <stdio.h>
#include <stdlib.h>
// 在 a[start:end) 中查找 x
int search(int a[], int start, int end, int x) {
// 递归出口:没有元素,返回 -1
if (start >= end) return -1;
// 中点位置
int middle = start + (end - start) / 2;
// 找到,返回索引
if (x == a[middle])
return middle;
if (x < a[middle])
// 在左边查找
return search(a, start, middle, x);
else
// 在右边查找
return search(a, middle+1, end, x);
}
int main() {
int a[] = {
1, 3, 8, 12, 13, 15, 19, 22, 23, 40, 42, 51,
59, 60, 62, 67, 88, 89, 90, 91, 94, 96, 98, 99
};
int N = 24;
int x = 88;
int index = search(a, 0, N, x);
printf("found index = %d\n", index);
return 0;
}
参考实现 2
使用 Javascript 语言实现,可在线运行。
function search(a, start, end, x) {
if (start >= end) return -1;
var middle = Math.floor(start + (end - start) / 2);
if (x == a[middle])
return middle;
if (x < a[middle])
return search(a, start, middle, x);
else
return search(a, middle+1, end, x);
}
function main() {
var a = [
1, 3, 8, 12, 13, 15, 19, 22, 23, 40, 42, 51,
59, 60, 62, 67, 88, 89, 90, 91, 94, 96, 98, 99];
var index = search(a, 0, a.length, x);
println("Your input = ", x);
println("found index = ", index);
}
x =
思考
在上图中,查找到 x (即 88 ) , 一共进行了多少次比较?
如果想要在程序中打印出比较的次数,应该怎样修改源程序?
浙公网安备 33010602011771号