三种顺序查找算法,领略算法之美

232 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

每天一小步,成功一大步。大家好,我是程序猿小白 gw_GW,很高兴能和大家一起学习每天小知识。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

本文主要从三种简单的顺序查找的算法,带领读者一起领略算法之美,开启算法之路。

1. linear_search

第一种顺序查找的算法最为简单,主要思想是:从下标为0的元素开始查找,一直找到最后一个元素为止。如果找到了就返回最后一个下标,没找到就返回-1.

来看具体代码实现:

int linear_search( int arr[], int len, int key ){
	int pos = -1;//存放找到的key的下标,没找到返回-1 
	for(int i = 0; i < len; i++){
		if(arr[i] == key){
			pos = i;
		}
	}
	return pos;
}

需要注意的就是pos的初始值要设为-1,以防找不到的情况。

2. better_linear_search

因为我们可能会遇到数组中含有多个key的情况,这时我们找到最后一个就可以直接返回,而不需要遍历整个数组。因此来说第二种顺序查找的算法要比第一种效率高一些。当然我们也可能会遇到如果有多个让我们返回最后一个的要求,不过丝毫不影响。我们只需要倒着查找即可。

来看具体代码实现:

int better_linear_search( int arr[], int len, int key ){
	for(int i = 0; i < len; i++){
		if(arr[i] == key){
			return i;//找到了就直接返回 
		}
	}
	return -1; 
}

3. sentinel_linear_search

是不是觉得上面一种方法已经可以了,但是我们还有更优的算法。

通过设置哨兵可以让我们减少N次判断。

  1. 用last保存数组的最后一个元素
  2. 把数组的最后一个元素赋值为key
  3. while循环进行查找,如果没找到key就一直进行循环,不过我们不用担心找不到,因为最后一个肯定会找到。
  4. 判断找到的i是不是我们真正需要的i,即判断我们是不是真的寻找到了key。
  5. 没找到就返回-1

来看具体代码:

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;//还原数组 
	//判断i是否满足条件,即确定是不是真的找到了key 
	if(i < len-1 || last == key){
		return i;
	}
	return -1;
}

结语

一个简单的顺序查找的例子也可以通过优美的算法变得更加迷人,快来和我一起领略算法之美吧!

以上内容如有不正之处,欢迎掘友们批评指正。