考研路_数据结构_查找1_顺序查找和二分查找

4 篇文章 0 订阅
3 篇文章 0 订阅

数据结构常用查找算法_顺序查找

顺序查找:在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从第一个开始逐个比较,直到找出与给定关键字相同的数为止。

C语言实现:

int Linear_Search1(int *a, int n, int key) 
{
	//从序列表中查找为key的关键值,成功则返回其下标值,否则查找失败,返回-1
	int i;
	for(i==1; i<=n; i++) 
	{
		if(a[i] == key) 
		{
			return i;
		}
	}
	return 0;
}


上述顺序查找代码中,并未最优化的,因为每次循环时都需要对i,进行越界判断(;i<=n;),为避免重复判断,可用哨兵法。代码如下:

int Linear_Search2(int *a, int n, int key) 
{
	int i;
	a[0] = key;          /*将关键值key赋值给a[0],即设置“哨兵”*/
	i = n;
	while(a[i] != key) 
	{
		i--;
	}
	return i;            /*返回0则说明未找到关键值key*/
}

Linear_Search2代码详解:

该段代码从尾部n开始查找,将a[0]赋值为key,若在查找过程中,成功找到key值,则返回其下标i,若无法找到,则i的值等于0。

“哨兵”法:在查找前设置哨兵,可避免查找过程的每次的溢出判断,在总数据较多时有效的改善了Linear_Search1的方法。

java语言实现:

public class LinearSearch {
	public int getIndex(int[] arr, int key) {
		int i;
		for(i=0; i<arr.length; i++) {
			if(arr[i] == key)
				return i;
		}
		return -1;
	}
}

这是个迭代过程,从数组下标为0到数组下标最大值,若找到给定关键值,则返回该值在数组中的位置,否则查找失败,时间复杂度为O(n)。

数据结构常用查找算法_二分查找

二分查找又称折半查找:每次选取剩下一半的中间进行查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

C语言实现:

int Binary_Search(int *a, int n, int key) 
{
	int low = 0;                        /*设置下区间*/
	int high = n;                       /*设置上区间*/
	if(a[low] == key)                   /*判断是否为上下端点*/
		return low;
	if(a[high] == key)
		return high;
	while(low <= high)
	{
		int mid = low + (high - low)/2; /*避免((low+high)/2)中(low+high)的结果溢出,即值大于数据类型所能表达的最大值*/
		if(a[mid] == key)               /*查找到关键值并返回其下标值*/
			return mid;
		else if(a[mid] < key) 
			low = mid + 1;              /*中间值比关键值小,则把中间值加1赋值给下一轮的下区间*/
		else 
			high = mid - 1;             /*中间值比关键值大,则把中间值减1赋值给下一轮的上区间*/
	}
}

java语言实现:

public class BinarySearch {
	public int getIndex(int[] arr, int key) {
		int low = 0;            //下区间
		int high = arr.length-1;//上区间
		while(low <= high) {    
			int mid = (low + high)/2;
			if(arr[mid] == key) {
				return mid;     //查找成功,返回关键值在数组中的位置
			}else if(arr[mid] < key) {
				low = mid + 1;  //中间值比关键值小,则把中间值加1赋值给下一轮的下区间
			}else {
				high = mid - 1; //中间值比关键值大,则把中间值减1赋值给下一轮的上区间
			}
		}
		return -1;              //查找失败
	}
}

二分查找过程,时间复杂度为O(logn)。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值