小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
每天一小步,成功一大步。大家好,我是程序猿小白 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次判断。
- 用last保存数组的最后一个元素
- 把数组的最后一个元素赋值为key
- while循环进行查找,如果没找到key就一直进行循环,不过我们不用担心找不到,因为最后一个肯定会找到。
- 判断找到的i是不是我们真正需要的i,即判断我们是不是真的寻找到了key。
- 没找到就返回-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;
}
结语
一个简单的顺序查找的例子也可以通过优美的算法变得更加迷人,快来和我一起领略算法之美吧!
以上内容如有不正之处,欢迎掘友们批评指正。