void search_2() { // 按照折半查找方式从关键字序列(8, 14, 18, 22, 31, 35,43, 49, 52, // 62, 71, 78, 83,88)中查找某关键字,若查询成功,输出其信息, // 否则提示错误。 */ int i, key, index; element list [MAX_SIZE]; int a[14] = {8, 14, 18, 22, 31, 35, 43, 49, 52, 62, 71, 78, 83, 88 }; // 虽然有点啰嗦,但我们需要把 int 数组的转换为element 类型的关 // 键字序列。 for(i=0; i<14; i++) { list[i].key = a[i]; } printf(“\n\n 折半查找\n\n 关键字列表为:\n”); for(i=0;i<14;i++) printf(“%d ”, list[i].key); printf(“\n\n 请输入您想要查询的关键字: ”); scanf(“%d”, &key); // 二叉查找 key index = ; // 根据 index 进行判断 if ( ) printf(“关键字%d 在第%d 位\n\n”, key, ); else printf(“没有查询到该关键字!\n\n”); }
时间: 2024-01-24 07:04:10 浏览: 11
这段代码实现了折半查找,输入一个关键字,然后在给定的关键字序列中查找这个关键字,如果找到了就输出该关键字在序列中的位置。
但是,这段代码存在一些问题:
1.在折半查找的过程中,应该使用循环来遍历关键字序列中的元素,每次取中间位置的元素与要查找的关键字进行比较,然后根据比较结果更新查找的区间。但是在这段代码中,没有使用循环,而是直接用了一个变量index来表示中间位置的下标,这样只能查找序列中的第一个元素,而不是查找整个序列。
2.在计算中间位置的时候,使用了一个错误的公式,应该是(left + right) / 2,而不是left + (right - left) / 2。
3.在判断关键字是否相等的时候,使用了一个错误的操作符"=",应该使用相等操作符"=="来判断两个值是否相等。
4.在输出查找结果的时候,应该使用找到的元素的下标来表示关键字在序列中的位置,而不是使用事先定义的变量index来表示。
正确的折半查找代码应该是这样的:
```c
void search_2() {
int i, key, index = -1, left = 0, right = 13;
element list[MAX_SIZE];
int a[14] = {8, 14, 18, 22, 31, 35, 43, 49, 52, 62, 71, 78, 83, 88};
//转换为element类型的关键字序列
for (i = 0; i < 14; i++) {
list[i].key = a[i];
}
printf("\n\n折半查找\n\n关键字列表为:\n");
for (i = 0; i < 14; i++) {
printf("%d ", list[i].key);
}
printf("\n\n请输入您想要查询的关键字: ");
scanf("%d", &key);
//折半查找
while (left <= right) {
index = (left + right) / 2;
if (list[index].key == key) {
break;
} else if (list[index].key < key) {
left = index + 1;
} else {
right = index - 1;
}
}
if (left <= right) {
printf("关键字%d在第%d位\n\n", key, index + 1);
} else {
printf("没有查询到该关键字!\n\n");
}
}
```