数据结构:各种查找算法实现

题目:

(1)顺序查找:使用数组或链表结构。用随机函数生成16个不重复的字母(’a’~’z’),键盘输入待查找的字母,返回查找成功与否,若成功则返回该字母所在的位置(序号),并计算比较次数。
(2)折半查找:用数组实现,查找前元素先排序。计算比较次数。分别用查找成功、不成功进行测试。
(3)二叉查找树:手工输入10个字母,生成一棵二叉查找树,用递归算法打印树结构或分别输出先序和中序遍历序列以确认其结构。键盘输入待查找的字母,计算比较次数。分别用查找成功、不成功进行测试。

思路:

(1)利用for循环,查找是否有匹配字符,然后输出位置和比较次数即可
(2)① 首先确定整个查找区间的中间位置 mid = ( left + right )/2 。
② 用待查关键字值与中间位置的关键字值进行比较;  若相等,则查找成功  若大于,则在后(右)半个区域继续进行折半查找  若小于,则在前(左)半个区域继续进行折半查找。
③ 对确定的缩小区域再按折半公式,重复上述步骤。最后,得到结果:要么查找成功, 要么查找失败。
(3)a.根据二分查找树特性建立二分查找树
b.将结点与查找值比较,若小,则往左子树找,若大,则往右子树找

代码块:

#include "pch.h"
#include <iostream>
#include<ctime>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
struct BStree
{
	char data;
	BStree*lchild;
	BStree*rchild;
};
int SqSearch(vector<char> alpha);//顺序查找
void BSearch(vector<char> alpha);//二分查找
void InsertBST(BStree *&T, char data);//二分查找树插入数据
BStree* SearchBST(BStree *T, char data,int &count);//二分查找树查找数据
void CreateBST(BStree *&T);//创建二分查找树
void PreOrder(BStree *&tree);//前序遍历
void ldr(BStree *&tree);//中序遍历

int main()
{
	srand(unsigned int(time(0)));
	vector<char> alpha;
	set<char>judge;
	while (alpha.size() < 16)
	{//创建随机数
		int tmp = rand() % 26;
		if (!judge.count(tmp + 'a'))
		{
			alpha.push_back(tmp + 'a');
			judge.insert(tmp + 'a');
		}
	}
	cout << "随机生成的字母如下所示:\n";
	for (auto c : alpha) cout << c << " ";
	cout << endl;
	cout << "**********顺序查找**********" << endl;
	SqSearch(alpha);
	sort(alpha.begin(), alpha.end());
	cout << "**********折半查找**********" << endl;
	BSearch(alpha);
	BSearch(alpha);
	BStree *t;
	CreateBST(t);
	cout << "二分查找树的前序遍历:\n";
	PreOrder(t);
	cout << endl;
	cout << "二分查找树的中序遍历:\n";
	ldr(t);
	cout <<endl;
	int count = 0;
	char data;
	cout << "请输入要查找字母:";
	cin >> data;
	if (SearchBST(t, data, count))
	{
		cout << "查找成功!" << endl;
		cout << "比较次数为:" << count << endl;
	}
	else
	{
		cout << "查找失败\n";
		cout << "比较次数为:" << count << endl;
	}
	count = 0;
	cout << "请输入要查找字母:";
	cin >> data;
	if (SearchBST(t, data, count))
	{
		cout << "查找成功!" << endl;
		cout << "比较次数为:" << count << endl;
	}
	else
	{
		cout << "查找失败\n";
		cout << "比较次数为:" << count<<endl;
	}
}
void BSearch(vector<char> alpha)//二分查找
{
	cout << "请输入要查找的的字母:";
	char c;
	cin >> c;//得到要查找字符
	if (!islower(c))
	{//如果不是小写字母,则查无字符
		cout << "查无此字符!" << endl;
		return ;
	}
	int low = 0;
	int high = alpha.size() - 1;
	int count = 0;
	while (low<=high)
	{
		count++;
		int mid = low + (high - low) / 2;//找到中间结点
		if (alpha[mid] == c)//找到了要搜索结点,则输出
		{
			cout << "查找成功!" << endl;
			cout << "比较次数:" << count << endl;
			return ;
		}
		else if (alpha[mid] > c) high = mid - 1;//若结点大于搜索值,则搜左半区
		else low = mid + 1;//若结点小于搜索值,则搜右半区
	}
	cout<<"查无此字符!\n";
}

int SqSearch(vector<char> alpha)//顺序查找
{
	cout << "请输入要查找的的字母:";
	char c;
	cin >> c;//得到要查找字符
	if (!islower(c))
	{//如果不是小写字母,则查无字符
		cout << "查无此字符!" << endl;
		return -1;
	}
	int count = 0;//比较次数
	int i;
	for (i = 0; i < alpha.size(); i++)
	{
		count++;//比较一次,比较次数增加
		if (alpha[i] == c)
		{//如果可以查到符号,输出
			cout << "查找成功!" <<endl;
			cout << "比较次数:" << count << '\t' << "字符所在位置:" << i << endl;
			return i;
		}
	}
	cout << "查无此字符!" << endl;
	return -1;//查无字符,返回-1
}

void InsertBST(BStree *&T, char data)//二分查找树插入数据
{
	if (!T)
	{//找到结点为空结点,将数据填入
		BStree*tmp = new BStree;
		tmp->data = data;
		tmp->lchild = NULL;
		tmp->rchild = NULL;
		T = tmp;
	}
	else if (T->data < data)InsertBST(T->rchild, data);//若数据大于结点值,往右子树填充
	else InsertBST(T->lchild, data);//若数据小于结点值,往左子树填充
}

BStree* SearchBST(BStree *T, char data , int &count)//二分查找树查找数据
{
	count++;
	if (!T || data == T->data)return T;
	else if (data < T->data) return SearchBST(T->lchild, data,count);
	else return SearchBST(T->rchild, data,count);
}

void CreateBST(BStree *&T)
{
	T = NULL;
	char data;
	cout <<"********二分查找树********\n";
	int count = 1;
	while (count <= 10)
	{	
		cout << "请输入要插入二分查找树的第" << count << "个数据:";
		cin >> data;
		InsertBST(T, data);
		count++;
	}
}

void PreOrder(BStree *&tree)//前序遍历
{
	if (tree)
	{
		cout << tree->data << '\t';
		PreOrder(tree->lchild);
		PreOrder(tree->rchild);
	}
}

void ldr(BStree *&tree)//中序遍历
{
	if (tree)
	{
		ldr(tree->lchild);
		cout << tree->data << '\t';
		ldr(tree->rchild);
	}
}

发布了330 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43981315/article/details/103915754