【数据结构】-折半查找

折半查找

  • 1.头文件及类型定义
  • 2.顺序表类型定义
  • 3.函数声明
  • 4.基本操作
    • 4.1 初始化顺序表
    • 4.2 赋值
    • 4.3 折半查找★★★
    • 4.4 main函数
  • 5.小结

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+树散列表,这些内容主要了解思想,代码实现不再阐述。

你可能感兴趣的:(数据结构)