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

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

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

尽量会用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
    评论
1.对于二叉排序树,下面的说法( )是正确的。 A.二叉排序树是动态树表,查找不成功时插入新结点时,会引起树的重新分裂和组合 B.对二叉排序树进行层序遍历可得到有序序列 C.用逐点插入法构造二叉排序树时,若先后插入的关键字有序,二叉排序树的深度最大 D.在二叉排序树中进行查找,关键字的比较次数不超过结点数的1/2 2.在有n个结点且为完全二叉树的二叉排序树中查找一个键值,其平均比较次数的数量级为( )。 A.O(n) B.O(log2n) C.O(n*log2n) D.O(n2) 3.静态查找与动态查找的根本区别在于( )。 A. 它们的逻辑结构不一样 B. 施加在其上的操作不同 C. 所包含的数据元素类型不一样 D. 存储实现不一样 4.已知一个有序表为{12,18,24,35,47,50,62,83,90,115,134},当折半查找值为90的元素时,经过( )次比较后查找成功。 A.2 B.3 C.4 D.5 5.已知数据序列为(34,76,45,18,26,54,92,65),按照依次插入结点的方法生成一棵二叉排序树,则该树的深度为( )。 A. 4 B. 5 C. 6 D. 7 6.设散列表表长m=14,散列函数H(k)=k mod 11 。表中已有15,38,61,84四个元素,如果用线性探测法处理冲突,则元素49的存储地址是( )。 A. 8 B. 3 C. 5 D. 9 7. 平衡二叉树的查找效率呈( )数量级。 A. 常数阶 B. 线性阶 C. 对数阶 D. 平方阶 8. 设输入序列为{20,11,12,…},构造一棵平衡二叉树,当插入值为12的结点时发生了不平衡,则应该进行的平衡旋转是( )。 A. LL B. LR C. RL D. RR 二、填空题(每空3分,共24分)。 1.在有序表A[1..18]中,采用二分查找算法查找元素值等于A[7]的元素,所比较过的元素的下标依次为 。 2.利用逐点插入法建立序列(61,75,44,99,77,30,36,45)对应的二叉排序树以后,查找元素36要进行 次元素间的比较,查找序列为 。 3. 用顺序查找法在长度为n的线性表中进行查找,在等概率情况下,查找成功的平均比较次数是 。 4. 二分查找算法描述如下: intSearch_Bin(SST ST, KT key) { low=1 ; high=ST. length; while(low<=high) { mid=(low+high)/2; if(key==ST.elem[mid].key) return mid; else if(key<ST.elem[mid].key) ; else ; } return 0; } 5.链式二叉树的定义如下: typedef struct Btn{ TElemType data; ; }BTN ,*BT; 6.在有n个叶子结点的哈夫曼树中,总结点数是 。 三、综合题(共52分)。 1. (共12分)假定关键字输入序列为19,21,47,32,8,23,41,45,40,出建立二叉平衡树的过程。 2. (共15分)有关键字{13,28,31,15,49,36,22,50,35,18,48,20},Hash 函数为H=key mod 13,冲突解决策略为链地址法,请构造Hash表(12分),并计算平均查找长度(3分)。 ASL= 3. (共10分)设关键字码序列{20,35,40,15,30,25},给出平衡二叉树的构造过程。 4. (共15分)设哈希表长为m=13,散列函数为H(k)=k mod 11,关键字序列为5,7,16,12,11,21,31,51,17,81;试求:散列后的表中关键字分布(假定解决冲突的方法为线性探测再散列法);求平均查找长度ASL;计算该表的装填因子。 (1)按要求求哈希表(10分): 0 1 2 3 4 5 6 7 8 9 10 11 12 (2)计算ASL(3分): ASL= (3)计算装填因子(2分):装填因子=

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值