王道数据结构代码---第七章:查找

目录

二叉排序树

顺序查找

           定义

           顺序实现代码 

折半查找(二分查找)

        定义

        qsort具体用法

        折半查找实现代码

                  完整代码

哈希查找(哈希即散列) 

        定义

        代码


二叉排序树

见文章

(40条消息) 王道数据结构代码---第五章:二叉树(重要)_jinzhi66的博客-CSDN博客

顺序查找

        定义

           顺序实现代码 

//顺序查找
int Search_Seq(SSTable ST, ElemType key)
{
	ST.elem[0] = key;  //让0号元素作为哨兵,确保不会越界
	int i;
	for (i = ST.TableLen - 1; ST.elem[i] != key; --i);  //从后往前查找
	return i; 
}

折半查找(二分查找)

        定义

必须是有序的顺序表,才能进行二分查找。

        qsort具体用法

 目的:为了实现顺序表有序。

 

         折半查找实现代码

//折半查找
int Binary_Search(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;   //查找失败,返回-1
}

         完整代码

#define  _CRT_SECURE_NO_WARNINGS   //解决scanf编译报错问题
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef int ElemType;

typedef struct {
	ElemType* elem;   //整型指针
	int TableLen;  //表的长度,存储动态数组里边元素的个数
}SSTable;

//顺序查找
int Search_Seq(SSTable ST, ElemType key)
{
	ST.elem[0] = key;  //让0号元素作为哨兵,确保不会越界
	int i;
	for (i = ST.TableLen - 1; ST.elem[i] != key; --i);  //从后往前查找
	return i;
}

//ST_Init是进行随机数的生成
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 = 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");
}

//折半查找
int Binary_Search(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;   //查找失败,返回-1
}

int compare(const void* left, const void* right)  //left, right是任意两个元素的地址值
{
	return *(ElemType*)left - *(ElemType*)right; //从小到大
	//return *(ElemType*)left - *(ElemType*)right;  //从大到小
}

//顺序查找 与  折半查找
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");
	}

	//折半查找(二分查找)
	qsort(ST.elem, ST.TableLen, sizeof(int), compare);//qsort实现的是快排
	ST_print(ST);
	printf("二分查找,请输入要搜索的key值:\n");
	scanf("%d", &key);
	//有序数组
	pos = Binary_Search(ST, key);
	if (pos != -1)
	{
		printf("查找成功 位置为 %d\n", pos);
	}
	else {
		printf("查找失败\n");
	}
	return 0;
}

哈希查找(哈希即散列) 

        定义

什么是散列函数:直白点的理解:把一个字符串算成数值的过程,就是散列函数

什么是散列冲突

怎么解决散列冲突?

        开放定址法,拉链法(链接法)。

什么是散列表?

 

 

        代码

#define MaxKey 1000
#include <stdio.h>
//这就是哈希函数
int hash(const char* key)
{
	int h = 0, g;
	while (*key)
	{
		h = (h << 4) + *key++;
		g = h & 0xf0000000;
		if (g)
		{
			h ^= g >> 24;
		}
		h &= ~g;
	}
	return h % MaxKey;//算出下标要取余
}


int main()
{
	const char* pStr[5] = { "xiongda","lele","hanmeimei","wangdao","fenghua" };
	int i;
	const char* pHash_table[MaxKey] = {NULL};//哈希表,散列表
	for (i = 0; i < 5; i++)
	{
		printf("%s is key=%d\n", pStr[i], hash(pStr[i]));//算哈希值并打印
		pHash_table[hash(pStr[i])] = pStr[i];//存入哈希表
	}
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值