【数据结构】-折半查找

本文详细介绍了如何在有序顺序表中实现折半查找。折半查找仅适用于静态或动态数组实现的有序顺序表,不适用于链表。算法时间复杂度为O(log2n),具有较高的查找效率。此外,文章还提到了其他查找算法如分块查找、B树和B+树、散列表,但未进行代码实现。

1.头文件及类型定义

#include<stdio.h>
#define ElemType int
#define MaxSize 10

2.顺序表类型定义

//顺序表的类型定义(静态分配)
typedef struct {		
	ElemType elem[MaxSize];		//用静态数组存放数据元素
	int length;			//顺序表的当前长度
}SeqList;

3.函数声明

/*函数声明*/
void InitList(SeqList& L);						//1.初始化顺序表
bool AssignList(SeqList& L);					//2.赋值
int Binary_Search(SeqList L, ElemType key);		//3.折半查找

4.基本操作

4.1 初始化顺序表

//1.初始化顺序表
void InitList(SeqList& L) {
	L.length = 0;
}

4.2 赋值

//2.赋值(仅做测试)
bool AssignList(SeqList& L) {
	int i = 0;
	ElemType x;
	scanf("%d", &x);
	while (x != -1) {		//输入-1结束顺序表赋值
		if (L.length >= MaxSize)		//判断当前存储空间是否已满,若已满,不能插入
			return false;
		L.elem[i] = x;
		L.length++;
		i++;
		scanf("%d", &x);
	}
	return true;
}

4.3 折半查找★★★

//3.折半查找
int Binary_Search(SeqList L, ElemType key) {
	int low = 0, high = L.length - 1, mid;
	while (low <= high) {
		mid = (low + high) / 2;			//取中间位置
		if (L.elem[mid] == key)
			return mid;					//查找成功返回所在位置
		else if (L.elem[mid] > key)		
			high = mid - 1;				//前半部分继续查找
		else
			low = mid + 1;				//后半部分继续查找
	}
	return -1;		//查找失败
}

4.4 main函数

int main() {
	SeqList L;
	InitList(L);

	printf("顺序表赋值开始,请依次输入元素:");
	if (!AssignList(L))
		printf("输入元素个数大于顺序表长度,赋值失败!");
	else {
		printf("当前顺序表的长度为:%d\n", L.length);
		int key;
		printf("请输入您要查找的值:");
		scanf("%d", &key);
		if (Binary_Search(L, key)==-1)
			printf("当前顺序表中无此元素!");
		else
			printf("您要查找的元素所在数组下标为:%d", Binary_Search(L, key));
	}
	return 0;
}

5.小结

  1. 折半查找适用说明
    与顺序查找不同,折半查找只适用于有序顺序表,不可使用链表,因为链表并不具备随机访问的特性。当然,既可以用静态数组实现的顺序表,也可用动态数组实现的顺序表,且必须有序。本文实现的是静态分配的顺序表。
  2. 折半查找的重要性质
    (1)折半查找的判定树是一棵平衡二叉树
    (2)元素个数为n时树高h= log2(n+1) (向上取整),故折半查找的时间复杂度为O(log2n)
  3. 关于查找的其他内容
    有关查找的内容还有分块查找B树和B+树散列表,这些内容主要了解思想,代码实现不再阐述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值