c语言学习笔记 - 顺序查找和哨兵查找比较

今天学习C时用到了顺序查找和哨兵查找,做了一个比较,主要是学习下哨兵查找法

例如在一个数组里查找一个元素,没找到返回-1,找到了则返回这个数组的下标也就是键值。

用循序查找法:

void arr_search(int arr[],int len,int key){

  int i=0;

  while(1){             

    if(i==len){    //用循序查找需要每个循环都判断是否已经循环完这个数组了

      return -1;  

    }    

    if(arr[i]==key){  //查找是否找到键值

      return i;

    }

    i++;

  }

}

//用哨兵查找法

void arr_search(int arr[],int len,int key){

  arr[len]=key; //把哨兵追加到数组末尾

  int i=0;

  while(1){    

    if(arr[i]==key){   //用哨兵找法,前面如果没找到要的值至少轮询到哨兵时会结束循环,这样相对比顺序查找肯定就少了一个循环

      return i;

    }

    i++;

  }

  return i==len?-1:i; //最后返回的时候再判断下是否是最后哨兵对应的键值,如果返回的是哨兵,说明没找到对应的数据

}

前面的例子用while循环如果用 for循环代替

例如改成以下,似乎也是少了一个if判断,和哨兵法一样省去了一个if判断,其实这个写法只是把条件判断写在了外边,即 括号里的  i<len

for(i=0;i<len;i++){

   if(arr[i]==key){  //查找是否找到键值

      return i;

    }

}

当然,在循环次数很小的情况下,差别也不大,但是如果循环次数达到了上万次,或者调用次数很多的话,还是有必要对循环内容进行优化,减少循环里的时间和空间消耗。

 

posted @ 2017-02-21 12:13  菜鸟开车  阅读(5597)  评论(2编辑  收藏  举报