查找算法(顺序查找,二分查找,二叉排序查找删除功能实现)

本文介绍了三种查找算法:顺序查找、二分查找以及二叉排序树的查找和删除操作。顺序查找的时间复杂度为O(n),二分查找的时间复杂度为O(logn)。示例代码展示了如何在C++中实现这些算法,并提供了测试用例。

顺序查找

//顺序查找
#include <stdio.h> 
#include <stdlib.h>
#include<time.h>
typedef int ElemType;
typedef struct {
	ElemType* elem;//整形指针,申请的堆空间的起始地址存入elem 
	int TableLen;//存储动态数组里边元素的个数 
}SSTable;

void ST_Init(SSTable &ST,int len){
	//多申请了一个位置,为了存哨兵,不使用哨兵也可以
	ST.TableLen = len + 1;
	ST.elem = (ElemType*)malloc(sizeof(ElemType)*ST.TableLen);
	int i;
	srand(time(NULL));//随机数生成
	for(i = 1; i < ST.TableLen; i++){//因为第0个是哨兵,所以从1随机 
		ST.elem[i] = rand() % 100;
	} 
}

int Search_Seq(SSTable ST,ElemType key){
	ST.elem[0] = key;//让零号元素作为哨兵
	int i;
	for(i = ST.TableLen - 1;ST.elem[i] != key;--i);
	return i;
	
}

void ST_print(SSTable ST){
	for(int i = 0;i < ST.TableLen;i++){
		printf("%3d",ST.elem[i]);
	}
	printf("\n");
}

int main()
{
	SSTable ST;
	ElemType key;
	int pos;//存储查询元素的位置 
	ST_Init(ST,10); 
	ST_print(ST);
	printf("请输入要搜索的key值:\n");
	scanf("%d",&key);
	pos = Search_Seq(ST,key);
	if(pos)
	{
		printf("查找成功 位置为 %d\n",pos);
	}else{
		printf("查找失败\n");
	}
	return 0;
}

二分查找

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int ElemType;
typedef struct{
	ElemType* elem;
	int TableLen;
}SSTable;
//init进行了随机数生成,折半查找我们使用哨兵
void ST_Init(SSTable& ST,int len)
{
	ST.TableLen = len;
	ST.elem = (ElemType*)malloc(sizeof(ElemType)* ST.TableLen);
	int i;
	srand(time(NULL));//随机数生成
	for(i = 0; i < ST.TableLen; i++){
		ST.elem[i] = rand()%100;
	} 
} 
void ST_print(SSTable ST){
	for(int i = 0;i < ST.TableLen;i++)
	{
		printf("%3d",ST.elem[i]);
	}
	printf("\n");
}
//时间复杂度 logn
int BinarySearch(SSTable L,ElemType key)
{
	int low = 0,high = L.TableLen - 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;
} 
int compare(const void *left,const void* right){
	return *(ElemType*)left - *(ElemType*)right;
	//return *(ELemType*)right - *(ElemType*)left;//从大到小 
}
int main()
{
	SSTable ST;
	ElemType key;
	int pos;//存储查询元素的位置
	ST_Init(ST,10);
	qsort(ST.elem,ST.TableLen,sizeof(ElemType),compare);//qsort实现的是快排
	ST_print(ST);
	printf("二分查找,请输入要搜索的key值:\n");
	scanf("%d",&key);
	//有序数组
	pos = BinarySearch(ST,key);//二分查找,也叫折半查找
	if(pos!=-1){
		printf("查找成功 位置为%d\n",pos);
	}else{
		printf("查找失败\n");
	}
	return 0;
}

二叉排序查找删除

//二叉查找树的删除 
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef int ElemType;
typedef struct BSTNode{
	ElemType data;
	BSTNode *lchild,*rchild;
}BSTNode,*BiTree;


//int BST_Insert(BiTree &T,int k){
//	BSTNode *s;
//	s = new BSTNode;
//	s->data = k;
//	s->lchild = NULL;
//	s->rchild = NULL;
//	if(T == NULL){
//		T = s;
//		return 0;
//	}
//	BSTNode *p = T, *parent;
//	while(p){
//		parent = p;
//		if(p->data > k){
//			p = p->lchild;
//		}else if(p->data < k){
//			p = p->rchild;
//		}else{
//			return -1;
//		}
//	}
//	if(parent->data > k){
//		parent->lchild = s;
//	}else if(parent->data < k){
//		parent->rchild = s;
//	}else{
//		return -1;
//	}
//	return 0;
//}

int BST_Insert(BiTree &T,int k){
	if(T == NULL){
		T = new BSTNode;
		T->data = k;
		T->lchild = NULL;
		T->rchild = NULL;
		return 1;
	}else if(T->data == k){
		return 0;
	}else if(T->data > k){
		return BST_Insert(T->lchild,k);
	}else{
		return BST_Insert(T->rchild,k);
	}
	
}

void Create_Tree(BiTree &T,int l[],int len){
	int i ;
	T = NULL;//空树 
	for(i=0; i < len; i++){
		BST_Insert(T,l[i]);
	}
}

void InOrder(BiTree T){
	if(T != NULL){
		InOrder(T->lchild);
		cout<<T->data<<" ";
		InOrder(T->rchild);
	}
}

BiTree BST_Search(BiTree T,ElemType x){
	while(T!=NULL&&T->data!=x){
		if(T->data > x){
			T = T->lchild;
		}else{
			T = T->rchild;
		}
	}
	return T;
}

void DeleteNode(BiTree &root, ElemType x){
	if(root == NULL){
		return;
	}else if(root->data > x){
		DeleteNode(root->lchild,x);
	}else if(root->data < x){
		DeleteNode(root->rchild,x);
	}else{
		if(root->lchild == NULL){
			BSTNode *temp = root;
			root = root->rchild;
			delete temp;
		}else if(root->rchild == NULL){
			BSTNode *temp = root;
			root = root->lchild;
			delete temp;
		}else{
			BSTNode *temp = root->lchild;
			while(temp->rchild!=NULL){
				temp = temp->rchild;
			}
			root->data = temp->data;
			DeleteNode(root->lchild,temp->data);
			/*
			另一种写法
			BSTNode *temp = root->rchild;
			while(temp->lchild!=NULL){
				temp = temp->lchild;
			}
			root->data = temp->data;
			DeleteNode(root->rchild,temp->data);
			*/
			
		}
	}
}

int main()
{
	BiTree T;
	int l[10];
	cout<<"请输入十个数字:";
	for(int i = 0; i< 10;i++){
		cin>>l[i];
	}
	cout<<"数组中的数字为:"<<endl;
	for(int i = 0; i< 10;i++){
		cout<<l[i]<<" ";
	}
	int len = 10;
	Create_Tree(T,l,len);
	cout<<endl;
	InOrder(T);
	BSTNode *search;
	cout<<endl<<"请您输入要查找的数:";
	int x;
	cin>>x;
	search = BST_Search(T,x);
	if(search){
		cout<<"二叉树中存在"<<x<<endl;
	}else{
		cout<<"查无该值!"<<endl;
	}
	cout<<"请输入要删除的值:";
	cin>>x;
	DeleteNode(T,x);
	InOrder(T);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值