查找算法的总结

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

(一)顺序查找

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

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

算法如下所示(其中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;
}

程序运行结果如下所示:


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

 

 

 



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值