我便考你一考。查找算法的三种形式,怎样写的?

125 阅读2分钟

有一回对我说道,“你学过算法么?”我略略点一点头。他说,“学过算法,……我便考你一考。查找算法的三种形式,怎样写的??”我想,讨饭一样的人,也配考我么?便回过脸去,不再理会。孔乙己等了许久,很恳切的说道,“不能写罢?……我教给你,记着!这些算法应该记着。将来做程序员的时候,划水要用。”

                                                           ————改至鲁迅先生《孔乙己》

数组的查找算法就蛮简单的,但自从我开了算法这门课才知道一个查找算法也有挺多门道的。这里给大家介绍一下这三种查找算法。

1

int linear_search( int arr[], int len, int key ){
	int i=0,pos=-1;
	while(i<len){
		if(arr[i]==key){
			pos=i;
		}
		i++;
	}
	return pos;
} 

这个代码应该无需过多解释,其中pos代表所找到的key值下标,在循环结束是,返回key值.如果没有找到。则返回key的初始值-1.

2

int better_search( int arr[], int len, int key ){
	int i=0;
	while(i<len){
		if(arr[i]==key){
			return i;
		}
		i++;
	}
	return -1;
}

我们将第二种方法与第一种作比较观察。第二种算法是一旦发现了key值就立马返回当前的下标值。所以当对同一序列进行查找时,使用这两种算法可能得出不同的结果,原因是当数组中出现多个相同的key值时,第一种返回的是数组中最后一个key值的下标,而第二种返回的是第一个key值的下标。

3.

int sentinel_linear_search( int arr[], int len, int key ){
	int last=arr[len-1];
	arr[len-1]=key;
	int i=0;
	while(arr[i]!=key){
		i++;
	}
	arr[len-1]=last;
	if(i<len-1||last==key){
		return i;
	}
	return -1;
}

第三种算法我们设置了一个“哨兵”。这个时候我们的循环将不再在乎下标越界的问题,因为我们将key值赋值到最后一个元素上,无论如何,总会在最后找到对应的key值。而且相比之下,第三种算法的while循环中,执行的只有i++这一步,所以第三种算法的效率是更高的。