数据结构学习之路(五)顺序查找和折半算法的原理及实现

排序和查找一向是考研,甚至是工作面试的必考题目,所以掌握这一块的内容非常有必要。

接下来笔者要对顺序查找、折半查找、分块查找进行简单讲解同时会附上代码。

尽量会用C语言和Python来实现这些简单的算法。

由于笔者能力有限,如有不妥之处敬请谅解,也请通过评论或者文章下方邮箱联系我,万分感谢。

一、顺序查找

顺序查找,又称为线性查找,主要用于在线性表中进行查找。线性表一般分为有序线性表和无序线性表。

1.对无序线性表进行查找

基本思路:从头到尾,依次与要查找的关键字比较。若相同,则返回下标;若不同,则返回-1。

C语言实现:
int SearchSeq(int *arr, int key){
	//假设arr[N-1]位置为空,即数组arr存放的事无意义的数
	int i;

	arr[N-1] = key;
	/*设置岗哨
	这样做的目的是为了在循环内部,不必判断数组是否越界,
	从而提升程序运行效率。
	*/
	
	for (i=0; arr[i]!=key;i++){
		if (arr[i] == key)  
        	break;  
	}

	if (i == N-1)  
        return -1;  
    else  
        return i; 
}

Python实现:
def SearchSeq(list, key):
	for i in range(len(list)):
		if list[i] == key:
			return i

	return -1

2.对有序线性表进行查找

对有序线性表进行查找稍有不同,其思想如下:

如果关键字key在线性表中可以找到,则查找方法与次数与对无序表进行查找是一样的。

如果关键字在线性表中找不到,则会有这着一种情况,数组arr[i]<key且arr[i+1]>key(数组arr的长度大于i+1),则循环停止,返回-1。

C语言实现:
int SearchSeq2(int *arr, int key){
	int i;

	arr[N-1] = key;
	/*设置岗哨
	这样做的目的是为了在循环内部,不必判断数组是否越界,
	从而提升程序运行效率。
	*/
	
	for (i=0; arr[i]!=key;i++){
		if (arr[i]<key && arr[i]> key){
			return -1;
		}
		if (arr[i] == key)  
        	break;  
	}

	if (i == N-1)  
        return -1;  
    else  
        return i; 
}

二、折半查找

折半查找,又称二分查找。仅适用于对有序表的查找。

基本思路:首先,将给定的关键字key与表中中间元素进行比较,若相等返回下标,若不等,则继续与除此中间元素的前半部分或后半部分进行同样的比较。

C语言实现:
int SearchBinary(int * arr, int key){
	int low = 0, heigh = N-1, mid;
	while(low <= heigh){
		mid = (low + heigh)/2;
		if (key==arr[mid])
			return mid;
		else if(key<arr[mid])
			heigh = mid - 1;
		else
			low = mid +1;
	}
	return -1;
}

/*
递归实现,初始low=0,height为数组长度减一
*/
int SearchBinary2(int * arr, int key, int low, int heigh){
	int mid = (low + heigh)/2;
	if (low>heigh)
		return -1;
	if (arr[mid]==key)
		return mid;
	else if (arr[mid] > key)
		return SearchBinary2(arr, key, low, mid-1);
	else
		return SearchBinary2(arr, key, mid+1, heigh);
}
Python实现:
def SearchBinary(l, key):
	low = 0
	height = len(l)-1
	while low <= height:
		mid = int((low + height)/2)
		if l[mid] == key:
			return mid;
		elif l[mid] > key:
			height = mid - 1
		else:
			low = mid + 1

	return -1

def SearchBinary2(l, key, low, heigh):
	mid = int((low+heigh)/2)
	if low > heigh:
		return -1
	if l[mid] == key:
		return mid
	elif l[mid] > key:
		return SearchBinary2(l, key, low, mid-1)
	else:
		return SearchBinary2(l, key, mid + 1, heigh)



当然,查找算法远远不止以上两种。感兴趣的同学可以移步:

七大查找算法

有时间的话,我也会尽量去学习和完善这部分内容。


email: 17126252@bjtu.edu.cn

版权声明:博客编写不易,转载时请注明出处,万分感谢 !

https://blog.csdn.net/zyy_2018/article/details/79784390




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值