C++数据结构与算法(七大查找)

目录

 

1 顺序查找(Sequence Search)

2 二分查找(Binary Search)

3 插值查找(Interpolation Search)

4 斐波那契查找(Fibonacci Search)

5 二叉查找树(Binary Search Tree)

6 分块查找(Block Search)

7 哈希查找(Hash Search)


1 顺序查找(Sequence Search)

顺序查找适用于存储结构为顺序存储或链式存储的线性表。

基本思想:

       顺序查找也称为线形查找,属于无序查找算法。从数据结构线性表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定K值进行比较,若相等则表示查找成功,若扫描结束仍旧没有找到关键字等于K的结点,则表示查找失败。

算法实现:

#include<iostream>
using namespace std;

int SequenceSearch(int a[], int value, int n)
{
	int i;
	for (i = 0; i<n; i++)
	if (a[i] == value)
		return i;
	return -1;
}

int main()
{
	int a[] = { 2, 3, 5, 8, 6, 7, 9, 0 };
	int key, index;
	int n = sizeof(a) / sizeof(a[0]);
	cout << "请输入待查找的值:" << endl;
	cin >> key;
	index = SequenceSearch(a, key, n);
	if (index >= 0)
	{
		cout << "找到了" << endl;
	}
	else
	{
		cout << "没找到" << endl;
	}
	system("pause");
	return 0;
}

2 二分查找(Binary Search)

说明:元素必须有序方能使用,无序则要先进行排序。

基本思想:

       二分查找也叫折半查找,属于有序查找算法。用给定K值先与中间节点的关键字进行比较,中间节点把线性表分层两个子表,若相等则查找成功;若不相等,再根据K与中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找或查找结束没有发现表中有这样的结点。

算法实现:

#include<iostream>
using namespace std;

//二分查找(折半查找),版本1
int BinarySearch1(int a[], int value, int n)
{
	int low, high, mid;
	low = 0;
	high = n - 1;
	while (low <= high)
	{
		mid = (low + high) / 2;
		if (a[mid] == value)
			return mid;
		if (a[mid]>value)
			high = mid - 1;
		if (a[mid]<value)
			low = mid + 1;
	}
	return -1;
}

//二分查找,递归版本
int BinarySearch2(int a[], int value, int low, int high)
{
	int mid = low + (high - low) / 2;
	if (a[mid] == value)
		return mid;
	if (a[mid]>value)
		return BinarySearch2(a, value, low, mid - 1);
	if (a[mid]<value)
		return BinarySearch2(a, value, mid + 1, high);
}

int main()
{
	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int key, len;
	cout << "请键入KEY值:" << endl;
	cin >> key;
	len = sizeof(a) / sizeof(a[0]);
	//int index = BinarySearch1(a, key, len);
	int index = BinarySearch2(a, key, 0, len-1);
	if (index >= 0) cout << "找到" << endl;
	else cout << "没找到" << endl;
	system("pause");
	return 0;
}

3 插值查找(Interpolation Search)

       插值查找是根据要查找的关键字Key与查找表中最大最小记录的关键字比较后的查找方法,其核心在于插值的计算公式:Key-arr[low]/arr[high]-arr[low]。mid的计算公式为:(high-low)*(key-arr[low])/(arr[high]-arr[lo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值