6-1【注意:查找失败时通过return NotFound进行返回】 二分查找

本题要求实现二分查找算法。

函数接口定义:

Position BinarySearch( List L, ElementType X );

其中List结构定义如下:

typedef int Position;
typedef struct LNode *List;
struct LNode {
    ElementType Data[MAXSIZE];
    Position Last; /* 保存线性表中最后一个元素的位置 */
};

L是用户传入的一个线性表,其中ElementType元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数BinarySearch要查找XData中的位置,即数组下标(注意:元素从下标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

Position BinarySearch( List L, ElementType X ){
	int low=1;//右边界
	int high=L->Last;//左边界
	while(low<=high){//执行条件
		int mid;
		mid=(low+high)/2;//计算中间值
		if(X==L->Data[mid]){//X等于mid指向的元素
			return mid;
		}
		else if(X<L->Data[mid]){//X在左边
			high=mid-1;
		}
		else{//X在右边
			low=mid+1;
		}
	}
	return NotFound;
}

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序查找二分查找和二叉树查找是常见的查找算法。它们在不同的场景下有不同的应用。 1. 顺序查找: 顺序查找是一种简单直观的查找方法,适用于无序数组或链表。它从头到尾依次遍历元素,直到找到目标元素或遍历完整个数据结构。顺序查找间复杂度是O(n),其中n是数据结构中的元素个数。 2. 二分查找二分查找是一种高效的查找方法,适用于有序数组或链表。它通过将目标元素与数组中间的元素进行比较,从而确定目标元素在左半部分还是右半部分,然后再在相应的半部分中进行查找。通过每次排除一半的元素,二分查找间复杂度是O(logN),其中N是数据结构中的元素个数。 3. 二叉树查找: 二叉树查找是一种基于二叉树结构的查找方法。它通过比较目标元素与当前节点的值的大小关系,从而确定目标元素在左子树还是右子树中,然后再在相应的子树中进行查找。二叉树查找间复杂度取决于树的高度,平均情况下为O(logN),最坏情况下为O(N),其中N是树中的节点个数。 以下是三种查找方法的示例代码: 顺序查找: ```python def sequential_search(arr, target): for i in range(len(arr)): if arr[i] == target: return i return -1 arr = [1, 2, 3, 4, 5] target = 3 index = sequential_search(arr, target) print("Index of target:", index) # 输出:2 ``` 二分查找: ```python def binary_search(arr, target): low = 0 high = len(arr) - 1 while low <= high: mid = (low + high) // 2 if arr[mid] == target: return mid elif arr[mid] < target: low = mid + 1 else: high = mid - 1 return -1 arr = [1, 2, 3, 4, 5] target = 3 index = binary_search(arr, target) print("Index of target:", index) # 输出:2 ``` 二叉树查找: ```python class TreeNode: def __init__(self, value): self.value = value self.left = None self.right = None def binary_tree_search(root, target): if root is None or root.value == target: return root if root.value < target: return binary_tree_search(root.right, target) else: return binary_tree_search(root.left, target) # 构建二叉树 root = TreeNode(4) root.left = TreeNode(2) root.right = TreeNode(6) root.left.left = TreeNode(1) root.left.right = TreeNode(3) root.right.left = TreeNode(5) root.right.right = TreeNode(7) target = 5 node = binary_tree_search(root, target) if node is not None: print("Target found in binary tree") else: print("Target not found in binary tree") ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值