查找算法系列之简单查找:顺序查找、二分查找、分块查找

简介:

最近总结了各大排序算法的原理 ,并对其进行了实现,想着一并把查找算法总结了,今天就着手開始总结查找算法。

废话不多说。这篇文章从最简单的查找算法開始讲起。之后会补充复杂的二叉搜索树查找(BST)和B树,B+树查找以及哈希查找等。

顾名思义,查找就是寻找到keyword在队列中的位置,最笨的查找算法就是依次顺序比較,复杂度为O(n)。可是有非常多方法的复杂度能够达到O(logn)等等。

1.顺序查找

keyword与数组中的数顺序比較,时间复杂度O(n).

template<class T>
int OrderSearch(T *x, int N, T keyWord)
{
	for(int i = 0; i < N; i++)
	{
		if(x[i] == keyWord)
			return i;
	}
	return -1;
}

2.二分查找

二分查找的条件是原数组有序。在查找时,将keyword与数组中间的数比較。若等于则找到。若大于则在其右边寻找,若小于则在其左边寻找,然后递归的进行二分查找。

时间复杂度O(logn)。

若有较频繁的插入操作,对于维护二分查找须要的有序结构,须要付出一定的时间代价。

template<class T>
int binarySearch(T *x, int low, int high, T keyword)//递归
{
	if(low > high)
		return -1;
	int mid = (low + high)/2;
	if(x[mid] == keyword) 
		return mid;
	if(x[mid] < keyword)
		return binarySearch(x, mid+1, high);
	if(x[mid] > keyword)
		return binarySearch(x, low, mid-1);
}

template<class T>
int binarySearch(T *x, int N, T keyword)//无递归
{
	int low = 0, high = N-1,mid;
	while(low <= high)
	{
		mid = (low + high)/2;
		if(x[mid] == keyword)
			return mid;
		else
			if(x[mid] < keyword)
				low = mid + 1;
			else
				high = mid -1;

	}
	return -1;
}

3.分块查找

分块查找是顺序查找的一种改进方法。

首先须要对数组进行分块,分块查找须要建立一个“索引表”。索引表分为m块,每块含有N/m个元素,块内是无序的,块间是有序的,比如块2中最大元素小于块3中最小元素。

先用二分查找索引表。确定须要查找的keyword在哪一块,然后再在对应的块内用顺序查找。

分块查找又称为索引顺序查找。

时间复杂度:O(log(m)+N/m)

//分块查找
template<class T>//索引表
struct INDEXTable
{
	T key;
	int link;
};

template<class T>  IndexOrderSearch(INDEXTable<T> *indexTable,T *x, int N, int m, T keyword)// indexTable为索引表,x为原数组,N为数组大小,m为块大小
{
	int L = (N+m-1)/m;
	int i = 0;
	while(i < L && indexTable[i].key < keyword)
		i++;
	if(i == L)
		return -1;
	else
	{
		int j = indexTable[i].link;
		for(j; j<indexTable[i].link + m;j++)
			if(x[j] == keyword)
				return j;		
	}
	return -1;
}


完整代码下载点击:

查找算法代码C++——包含顺序、二分、BST、哈希

http://download.csdn.net/detail/u010025211/8841123





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5305160.html,如需转载请自行联系原作者

相关文章
|
1月前
|
存储 算法 索引
【优选算法】—— 二分查找
【优选算法】—— 二分查找
|
1月前
|
算法 程序员 数据处理
算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解
算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解
|
2月前
|
人工智能 算法 测试技术
【动态规划】【二分查找】C++算法 466 统计重复个数
【动态规划】【二分查找】C++算法 466 统计重复个数
|
3月前
|
算法 测试技术 C#
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
|
3月前
|
算法 测试技术 C#
C++二分查找算法:包含每个查询的最小区间
C++二分查找算法:包含每个查询的最小区间
|
4月前
|
算法 JavaScript 前端开发
JavaScript算法和数据结构:写一个二分查找的函数。
JavaScript算法和数据结构:写一个二分查找的函数。
32 0
|
3月前
|
存储 算法 Java
【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?
【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?
|
25天前
|
算法 索引
算法思想总结:二分查找算法
算法思想总结:二分查找算法
|
2月前
|
机器学习/深度学习 算法 Java
【数据结构查找算法篇】----二分查找【实战项目】
【数据结构查找算法篇】----二分查找【实战项目】
24 1
|
2月前
|
算法 测试技术 C++
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II