数据结构与算法 查找

目录

一、线性表的查找

1、顺序查找

2、折半查找

2.1 迭代方法

2.2 递归方法

3、分块查找(索引顺序查找)

4、三种查找方法比较

二、树表的查找

1、二叉排序树

1.1 二叉排序树的定义

1.2 二叉排序树的存储结构

1.3 二叉排序树的递归查找算法

1.4 二叉排序树算法的分析

1.5 二叉排序树的操作

2、平衡二叉树

2.1 平衡二叉树的定义

2.2 失衡二叉排序树的分析与调整

三、散列查找

1、相关介绍

2、处理冲突的方法

2.1 开放定址法 (开放地址法)

2.2 链地址法(拉链法)

3、散列表查找

一、线性表的查找

1、顺序查找

      

2、折半查找

这里有两种实现方法,一种是迭代,一种是递归。

2.1 迭代方法

#include<stdio.h>
#define N 10
typedef struct{
	int data[N];
	int length;
}nums;
int Seach_bin(nums a, int key)
{
	int left = 0;
	int right = a.length;
	int mid;
	while(left <= right){
		mid = (left + right) / 2;
		if(a.data[mid] == key)  // 找到返回mid + 1 
			return mid + 1; 
		if(key < a.data[mid])   // mid位置的值比key大,则key应该在左侧 
			right = mid - 1;
		else                    // mid位置的值比key小,则key应该在右侧
			left = mid + 1;   
	}	
	return -1;        // 没有找到,返回-1 
} 
int main()
{
	nums a;
	for(int i = 0;i < 10;i++) // 此处按照升序存储 
		a.data[i] = i + 1;
	a.length = 10;
	int key = 6;
	int loc = Seach_bin(a,key);
	printf("%d\n",loc);
	return 0;
}

2.2 递归方法

#include<stdio.h>
#define N 10
typedef struct{
	int data[N];
	int length;
}nums;
int Seach_bin(nums a, int key, int left, int right){
	int mid = (left + right) / 2;
	if(left > right)  // 超出范围,查找失败 
		return -1;
	else if(key < a.data[mid])      // mid位置的值比key大,则key应该在左侧
		return Seach_bin_digui(a, key, left, mid - 1);
	else if(key > a.data[mid])      // mid位置的值比key小,则key应该在右侧
		return Seach_bin_digui(a, key, mid + 1, right);
	else                            // 查找成功,返回mid + 1
		return mid + 1;     
}
int main()
{
	nums a;
	for(int i = 0;i < 10;i++) // 此处按照升序存储 
		a.data[i] = i + 1;
	a.length = 10;
	int key = 6;
	int loc = Seach_bin(a, key, 0, a.length - 1);
	printf("%d\n",loc);
	return 0;
}

    

3、分块查找(索引顺序查找)

    

4、三种查找方法比较

二、树表的查找

前面的几种查找方法,当表插入、删除操作频繁时,为维护表的有序性,需要移动表中很多记录。

那么,这节来学习下面的方法。

1、二叉排序树

1.1 二叉排序树的定义

 

1.2 二叉排序树的存储结构

1.3 二叉排序树的递归查找算法

 

1.4 二叉排序树算法的分析

    

1.5 二叉排序树的操作

         

2、平衡二叉树

2.1 平衡二叉树的定义

  

2.2 失衡二叉排序树的分析与调整

当我们在一个平衡二叉排序树上插入一个结点时,有可能导致失衡,即出现平衡因子绝对值大于1的结点,如: 2、-2。如果在一棵AVL树中插入一个新结点后造成失衡,则必须重新调整树的结构,使之恢复平衡。

 
(1)LL型调整

  

(2)RR型调整

    

(3)LR型调整

   

(4)RL型调整

   

如下例子: 

     

三、散列查找

1、相关介绍

     

散列构造方法:

   

2、处理冲突的方法

2.1 开放定址法 (开放地址法)

线性探测法:

 

二次探测法:

伪随机探测法:

2.2 链地址法(拉链法)

   

3、散列表查找

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值