[英]How can I simplify this working Binary Search code in C?
大家好,幾周前開始用 C 編程,學習算法,只是想知道如何讓我的代碼更簡單,它只是一個二進制搜索函數。 但唯一的事情是你必須保持論點相同,提前致謝。
bool search(int value, int values[], int n)
{
int min = values[0];
int max = values[n-1];
int average = (min + max) / 2;
if(average == value)
{
return true;
}
while (average > value)
{
max = average - 1;
average = (min + max) / 2;
}
while (average < value)
{
min = average + 1;
average = (min + max) / 2;
}
if (max < min)
{
return false;
}
if (average == value) {
printf("%i\n", average);
return true;
}
else
{
return false;
}
}
在二分查找中有很多小事情你必須做對:處理 length=0 的情況,確保你測試的位置總是有效的,確保你沒有溢出(即,`(low+high) /2' 不是最好的寫法),確保新的測試位置總是與前一個不同,等等。
在做了一百萬次之后,我寫的每一個二分搜索現在都是這樣完成的:
bool search(int[] array, int length, int valueToFind)
{
int pos=0;
int limit=length;
while(pos<limit)
{
int testpos = pos+((limit-pos)>>1);
if (array[testpos]<valueToFind)
pos=testpos+1;
else
limit=testpos;
}
return (pos < length && array[pos]==valueToFind);
}
請注意,我們每次迭代只需要做一次比較,這比大多數可以做 2 的實現要快。而不是在循環內進行相等測試,我們可靠地找到要查找的元素所屬的位置,每次只使用一次比較迭代,然后在最后測試以查看我們想要的元素是否在那里。
我們計算testpos
的方式確保pos <= testpos < limit
,即使長度是最大可能的整數值,它也能工作。
這種形式還可以很容易地讀出你想看到的不變量,而不必考慮像high<low
這樣奇怪的邊界條件。 當您退出循環時, pos==limit
這樣您就不必擔心使用錯誤的等等。
這個循環中的條件也很容易適應不同目的的二進制搜索,比如“找到插入 x 的位置,確保它在數組中已經存在的所有 x 之后”,“找到數組中的第一個x”,“找到數組中的最后一個x”等。
這不是二分查找的正確實現,所有條件都必須在一個循環中,例如: max 必須是 n-1 而不是 values[n-1] 和 min=0 而不是 values[0] 你也應該將 values[average] 與 value 進行比較,而不僅僅是平均變量。
bool search(int value, int values[], int n){
int min = 0;
int max = n-1;
int average ;
while(max>=min){
average = (min + max) / 2;
if(values[average] == value)
{
return true;
}
if (values[average] > value)
{
max = average - 1;
average = (min + max) / 2;
}
if (values[average] < value)
{
min = average + 1;
average = (min + max) / 2;
}
}
return false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.