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 13:01:51 浏览: 112
下面是二分查找的实现代码:
```
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-3 先序输出叶结点 分数 15 作者 陈越 单位 浙江大学 本题要求按照先序遍历的顺序输出给定二叉树的叶结点。 函数接口定义: void PreorderPrintLeaves( BinTree BT );
题目描述的是关于二叉树数据结构的一个编程任务,要求实现一个名为`PreorderPrintLeaves`的函数,该函数用于按照先序遍历(根节点 -> 左子树 -> 右子树)的方式打印出给定二叉树的所有叶节点(即没有子节点的节点)。这是递归操作的一种常见应用场景,因为先序遍历时首先访问根节点,如果当前节点是叶子节点,则直接输出,然后递归地遍历左子树和右子树。
在C++或类似语言中,你可以这样做:
```cpp
// 假设BT是一个二叉树的指针类型
void PreorderPrintLeaves(BinTree BT) {
if (BT != nullptr) { // 遍历直到遇到空节点
// 如果当前节点是叶子节点,输出它
if (BT->left == nullptr && BT->right == nullptr) {
cout << BT->data << " "; // 假设data是每个节点的数据
}
// 递归处理左右子树
PreorderPrintLeaves(BT->left);
PreorderPrintLeaves(BT->right);
}
}
```
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;
}
你可以在函数体内使用循环或递归来计算阶乘。
阅读全文