R6-3 二分查找 分数 17 作者 陈越 单位 浙江大学 本题要求实现二分查找算法。 函数接口定义: Position BinarySearch( List L, ElementType X ); 其中List结构定义如下: typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* 保存线性表中最后一个元素的位置 */ }; L是用户传入的一个线性表,其中ElementType元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数BinarySearch要查找X在Data中的位置,即数组下标(注意:元素从下标1开始存储)。找到则返回下标,否则返回一个特殊的失败标记NotFound。 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 #define NotFound 0 typedef int ElementType; typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* 保存线性表中最后一个元素的位置 */ }; List ReadInput(); /* 裁判实现,细节不表。元素从下标1开始存储 */ Position BinarySearch( List L, ElementType X ); int main() { List L; ElementType X; Position P; L = ReadInput(); scanf("%d", &X); P = BinarySearch( L, X ); printf("%d\n", P); return 0; } /* 你的代码将被嵌在这里 */ 输入样例1: 5 12 31 55 89 101 31 输出样例1: 2 输入样例2: 3 26 78 233 31 输出样例2: 0
时间: 2024-01-25 18:01:51 浏览: 79
下面是二分查找的实现代码:
```
Position BinarySearch(List L, ElementType X)
{
Position left = 1; // 左边界
Position right = L->Last; // 右边界
while (left <= right) {
Position mid = (left + right) / 2; // 中间位置
if (L->Data[mid] == X) { // 找到了
return mid;
} else if (L->Data[mid] > X) { // 往左边找
right = mid - 1;
} else { // 往右边找
left = mid + 1;
}
}
// 没找到
return NotFound;
}
```
具体思路是:首先设置左边界为1,右边界为L的最后一个元素的位置;然后在每一次循环中,取左右边界的平均值作为中间位置mid,并将L->Data[mid]和X进行比较,如果相等,则找到了,返回mid;如果L->Data[mid]比X大,则说明要在mid的左边继续查找,此时将右边界right更新为mid-1;否则说明要在mid的右边继续查找,此时将左边界left更新为mid+1。如果最终没有找到,返回NotFound。
相关问题
6-1 简单阶乘计算 分数 20 作者 陈越 单位 浙江大学 本题要求实现一个计算非负整数阶乘的简单函数。 函数接口定义: int Factorial( const int N ); 其中N是用户传入的参数,其值不超过12。如果N是非负整数,则该函数必须返回N的阶乘,否则返回0。 裁判测试程序样例: #include <stdio.h> int Factorial( const int N ); int main() { int N, NF; scanf("%d", &
N);
NF = Factorial(N);
if (NF)
printf("%d! = %d\n", N, NF);
else
printf("Invalid input\n");
return 0;
}
你可以在函数体内使用循环或递归来计算阶乘。
6-4 求二叉树高度 分数 20 作者 陈越 单位 浙江大学 本题要求给定二叉树的高度。 函数接口定义: int GetHeight( BinTree BT ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; 要求函数返回给定二叉树BT的高度值。 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> typedef char ElementType; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; BinTree CreatBinTree(); /* 实现细节忽略 */ int GetHeight( BinTree BT ); int main() { BinTree BT = CreatBinTree(); printf("%d\n", GetHeight(BT)); return 0; } /* 你的代码将被嵌在这里 */ 输出样例(对于图中给出的树): 4
可以使用递归的方法,分别求出左子树和右子树的高度,取最大值加一即可。以下是一个示例代码:
```c
int GetHeight(BinTree BT)
{
if (!BT) {
return 0;
}
int left_height = GetHeight(BT->Left);
int right_height = GetHeight(BT->Right);
return (left_height > right_height) ? (left_height + 1) : (right_height + 1);
}
```
其中,`GetHeight` 函数接受一个二叉树的根节点作为参数,返回该二叉树的高度。首先判断根节点是否为空,如果为空则返回 0。否则,递归求出左子树和右子树的高度,取最大值加一就是该二叉树的高度。
阅读全文