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;

    }

}

當然,在循環次數很小的情況下,差別也不大,但是如果循環次數達到了上萬次,或者調用次數很多的話,還是有必要對循環內容進行優化,減少循環里的時間和空間消耗。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM