数据结构:查找

一. 静态查找表

静态查找表是仅对查找表进行查找操作,而不能改变其中数据的线性表,可以是基于数组的顺序存储或以线性链表存储。静态查找表主要有顺序表、有序顺序表和索引顺序表三种。

 1. 顺序查找

函数模型

int seqsearch(element list[], int searchnum, int n)
{
	
	int i;
	for (i=0;i < n; i++) //遍历这n个元素
		if (list[i].key == searchnum)  //若第i个元素的关键字等于searchnum
			return i;
		//若循环结束了,还没有返回,说明什么?那么如何返回?
	if(i == n)
		return -1;
}

2.折半查找

2.1非递归折半查找

int binsearch(element list [], int searchnum, int n)
{
	int left = 0, right = n-1, middle; 
	while (!(left == right)){
		middle = (left + right)/2;                             //计算中点下标
		if  (list[middle].key < searchnum)                     // 根据下一条语句,你说填什么?
			left = middle+1;                                   //这条语句说明查找的关键字在哪个半区?
		else if (list[middle].key == searchnum)                //什么条件下返回 middle啊?
			return middle;
		else
			right = middle -1;                                 //剩下的你有的选择吗?
	}
	return -1;
}
2.2递归折半查找
int binsearch2(element list[],int searchnum,int start,int end)
{
	int left = start,right = end,middle;
//	printf("left = %d,right = %d\n",left,right);
	middle = (left + right)/2;
	while(!(left == right))
	{
		if(list[middle].key > searchnum)
			return binsearch2(list,searchnum,left,middle - 1);
		if(list[middle].key == searchnum)
			return middle;
		if(list[middle].key < searchnum)
			return binsearch2(list,searchnum,middle + 1,right);
	}
    return -1;
}
3.索引表查找
int indexsequelsearch(indextype ls[] , elemtype s[] , int m, int n ,keytype key)
{
	int i , j ,last;
	i=0;                                        //找到key所在块的索引
	while(i < m && key > ls[i].key)
		i++;
//	printf("i = %d",i);
	if(i == m) 	                                //若该索引超过了最大索引值,则表明key大于s中的最大值,查找失败
		return  -1;
	else 
	{ 
		//key可能在第i块中,找到第i块在s中的起始下标赋值到j
        j = ls[i].link;
		//last标识搜索的终点
		if (i<m-1) last = ls[i+1].link;
		else last = n;
		//在s中查找key,直到找到key值,或者与全部n个数据均比较完
        while(key!=s[j].key && j < last)
			j++;
		//根据j值判断是否查找到key
        if(j < last)
			return  j ;
        else 
			return -1;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值