检索算法——顺序查找与二分查找

1.问题

在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0。

2.解析

顺序查找算法原理:
对于任意一个序列T以及一个给定的元素x,将给定元素x与序列T中元素依次比较,直到找出与给定关键字x相同的元素,或者将序列T中的元素与其都比较完为止。

顺序查找算法实现步骤:
1、从T[0]开始比较;
2、若与给定的元素x相同,则查找结束;反之,则与序列T的下一个元素进行比较;
3、重复步骤二,直至找到与给定关键字x相同的元素,返回该元素的下标;若序列T中的元素全部完成与x的比较后,仍未找到与x相同的值,则返回0。

顺序查找算法查找给定元素的过程(假设x=6):
1、初始化数组T
在这里插入图片描述
2、与T[0]比较,T[0]=1<6,继续往后比较
在这里插入图片描述
3、与T[1]比较,T[1]=2<6,继续往后比较
在这里插入图片描述
4、与T[2]比较,T[2]=3<6,继续往后比较
在这里插入图片描述
5、与T[3]比较,T[3]=4<6,继续往后比较
在这里插入图片描述
6、与T[4]比较,T[4]=5<6,继续往后比较
在这里插入图片描述
7、与T[5]比较,T[5]=6==6,找到给定元素x,结束查找,返回下标5
在这里插入图片描述

二分查找算法原理:
假设序列T中元素是按升序排列,将T中间位置记录的关键字T[mid]与查找关键字x比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字T[mid]大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

二分查找算法实现步骤:
1、定义左边界left与右边界right,中间下标mid,其中,left = 0,right = n - 1,mid = (left + right) / 2;
2、从T[mid]开始比较,若T[mid] == x,则查找结束,返回下标mid;若T[mid] > x,则right = mid - 1;
若T[mid] < x,则left = mid + 1;
3、若left > right,则表明给定元素x不在序列T中,查找失败,返回0。

二分查找算法查找给定元素的过程(假设x=6):
1、初始化数组T,left = 0,right = 8,mid =(0 + 8)/ 2 = 4
检索算法——顺序查找与二分查找_第1张图片
2、与T[4]比较,T[4]=5<6,left = mid + 1 = 5,mid =(5 + 8)/ 2 = 6
检索算法——顺序查找与二分查找_第2张图片
3、与T[6]比较,T[6]=7>6,right = mid - 1 = 5,mid =(5 + 5)/ 2 = 5
检索算法——顺序查找与二分查找_第3张图片
4、与T[5]比较,T[5]=6==6,找到给定元素x,结束查找返回下标5。

3.设计

n表示序列T中的元素个数
顺序查找算法查找给定元素的伪代码:

int Order_search(int T[], int n, int x) {
int i;
	for (i = 0; i < n; i++){
		if (T[i] == x) {
			返回下标
		}
	}
	return 0;
}

二分查找算法查找给定元素的伪代码:

int Binary_search(int T[], int n, int x) {
	int left, right, mid;
	初始化左边界,右边界
	while (left <= right){
		更新中间下标mid
		if (T[mid] == x) {
			返回下标
		}
		else{
			if (T[mid] > x) {
				更新右边界right
			}
			else{
				更新左边界left
			}
		}
	}
	return 0;
}

4.分析

顺序查找算法查找给定元素的时间复杂度为O(n);
二分查找算法查找给定元素的时间复杂度为O(log2n);

5.源码

顺序查找算法查找给定元素的源码地址:
https://github.com/Ying917/Algorithm-Analysis/blob/master/Order_search.c

二分查找算法查找给定元素的源码地址:
https://github.com/Ying917/Algorithm-Analysis/blob/master/Binary_search.c

你可能感兴趣的:(算法)