今天學習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;
}
}
當然,在循環次數很小的情況下,差別也不大,但是如果循環次數達到了上萬次,或者調用次數很多的話,還是有必要對循環內容進行優化,減少循環里的時間和空間消耗。