查找算法的总结

算法实现 专栏收录该内容
53 篇文章 0 订阅

查找算法从总体上来说可以分为四类,它们分别是顺序查找,二分查找,分块查找以及散列表。下面简单的介绍一下各种查找算法。

(一)顺序查找

原理:让关键字与队列中的数从第一个(或最后一个)开始逐个进行比较,直到找出与关键字相同的数为止,否则查找失败。

顺序查找适用于线性表的顺序存储结构和链式存储结构。

算法如下所示(其中ElemType为数据类型):

int search(ElemType array[],int n,ElemType key)
{
	for(int i=0;i<n;i++)
		if(array[i]==key)
			break;
	if(i<n)
		return i;
	else
		return -1;
}

(二)二分查找

二分查找也称之为折半查找,它要求数据采用顺序存储结构,并且待排序序列是有序数列。

原理:将表中间的位置记录的关键字与所查找的关键字进行比较,如果相等则查找成功,否则利用中间位置将表分为前后两个子表,根据中间位置记录的关键字与查找关键字的大小关小确定接下来查找哪个子表,重复上述过程,直到找到满足条件的记录,查找成功,否则查找失败。

算法实现如下:

#include "stdafx.h"
#include<iostream>
using namespace std;
int binarysearch(int *array,int start,int end,int key);

int _tmain(int argc, _TCHAR* argv[])
{
	int count,blockcount;
	int key;
	int i,j;
	cout<<"input the number of digits:"<<endl;
	cin>>count;
	cout<<"input details of digits:"<<endl;
	int *point=new int[count];
	for(int i=0;i<count;i++)
	{
		cin>>point[i];
	}
	cout<<"input the key to search:"<<endl;
	cin>>key;
	cout<<"the key is in position "<<binarysearch(point,0,count-1,key);
	delete[] point;
	return 0;
}

int binarysearch(int *array,int start,int end,int key)
{
	int low=start;
	int high=end;
	int mid;
	if(low>high)
	{
		cout<<"查找范围有错"<<endl;
		return -1;
	}
	while(low<=high)
	{
		mid=(low+high)/2;
		if(*(array+mid)==key)
		{
			return mid+1;
		}
		else if(*(array+mid)<key)
		{
			low=mid+1;
		}
		else
		{
			high=mid-1;
		}
	}
	return -1;
}


运行结果如下所示:

(三)分块查找

分块查找又称之为索引顺序查找,是顺序查找的一种改进。

该方法是将n个数据按块有序划分为m个子块(m<n),每一个字块中的数据不需要有序,但是块与块之间需要有序,即第一块中的所有元素都必须小于(或者大于)第二块中的任何一个数据,第二块中的所有元素都必须小于(或者大于)第三块中的任何一个数据,以此类推。

原理:先取出各块中的最大关键字构成索引表,再对索引表进行二分查找或者顺序查找,以确定待查记录在那个子块中,最后在已经确定的子块中按顺序查找的方式进行查找。

我们首先可以定义一个结构体如下所示:

struct block
{
	int key;//存储块中最大记录
	int start;//块的起始索引
	int end;//块的结束索引
};

完整的算法实现如下:

#include "stdafx.h"
#include<iostream>
using namespace std;
struct block
{
	int key;//存储块中最大记录
	int start;//块的起始索引
	int end;//块的结束索引
};

int _tmain(int argc, _TCHAR* argv[])
{
	int count,blockcount;
	int key;
	int i,j;
	cout<<"input the number of digits:"<<endl;
	cin>>count;
	cout<<"input details of digits:"<<endl;
	int *point=new int[count];
	for(int i=0;i<count;i++)
	{
		cin>>point[i];
	}
	cout<<"input the key to search:"<<endl;
	cin>>key;
	cout<<"input the number of blocks:"<<endl;
	cin>>blockcount;
	block *table=new block[blockcount];
	cout<<"input the detais of each block:"<<endl;
	for(int i=0;i<blockcount;i++)
	{
		cin>>table[i].key>>table[i].start>>table[i].end;
	}
	i=0;
	while(i<blockcount&&table[i].key<key)
	{
		i++;
	}
	if(i>=blockcount)
		return 0;
	for(j=table[i].start;j<=table[i].end;j++)
	{
		if(point[j]==key)
			break;
	}
	if(j<=table[i].end)
		cout<<"the key is in "<<j+1<<endl;
	delete[] point;
	delete[] table;
	return 0;
}

程序运行结果如下所示:


欢迎转载,但请标注转载链接....谢谢

 

 

 



  • 0
    点赞
  • 1
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:白松林 返回首页

打赏

DreamMakers

您的肯定是我坚持的最大动力。

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值