今天在學習《程式設計之美》的時候,看到乙個二分查詢的題目,發現原來我真的不懂二分查詢。
二分查詢時候注意的事項:
在求二分查詢的中間點時沒有使用
midindex = (minindex + maxindex) / 2
是因為,以免 minindex + maxindex之後會導致溢位而出現錯誤。
注意迴圈的迴圈終止條件及邊界元素的判定。
下面把牛人做的該題部分的擴充套件(c++)拿來展示一下,以供學習:
#include #include#include
#include
using
namespace
std;
/*//1: 給定乙個有序(不降序)陣列arr,求最大的i使得arr[i]等於v,不存在則返回-1
int bisearch(char arr[10], int begin, int end, char *v)
//從最大索引開始判斷
if(!strcmp(arr[maxindex], v))
return maxindex;
else if(!strcmp(arr[minindex], v))
return minindex;
else
return -1;}*/
/*//2: 乙個有序(不降序)陣列arr,求任意乙個i使得arr[i]等於v,不存在則返回-1
int bisearch(char (*arr)[10], int begin, int end, char *v)
cout << "minindex = " << minindex << " maxindex = " << maxindex << endl;
if(!strcmp(*(arr + minindex), v))
return minindex;
return -1;}*/
/*//3:給定乙個有序(不降序)陣列arr,求最小的i使得arr[i]等於v,不存在則返回-1
int bisearch(char (*arr)[10], int begin, int end, char *v)
cout << "minindex = " << minindex << " maxindex = " << maxindex << endl;
//從最小數開始判斷
if(!strcmp(*(arr + minindex), v))
return minindex;
else if(!strcmp(*(arr + maxindex), v))
return maxindex;
else
return -1;}*/
/*//4:給定乙個有序(不降序)陣列arr,求最大的i使得arr[i]小於v,不存在則返回-1
int bisearch(char (*arr)[10], int begin, int end, char *v)
//從最大數開始判斷
if(strcmp(*(arr + maxindex), v) < 0)
return maxindex;
else if(strcmp(*(arr + minindex), v) < 0)
return minindex;
else
return -1;}*/
//5; 給定乙個有序(不降序)陣列arr,求最小的i使得arr[i]大於v,不存在則返回-1
int bisearch(char (*arr)[10], int begin, int end, char *v)
//從小數開始判斷
if(strcmp(*(arr + minindex), v) > 0
)
return
minindex;
else
if(strcmp(*(arr + maxindex), v) > 0
)
return
maxindex;
else
return -1;}
intmain()
;
char v = "
dddd";
int last = sizeof(a) / (sizeof(char) * 10
);
int index = bisearch(a, 0, last-1
, v);
printf(
"index of v is %d\n
", index);
return0;
}
參考資料
[1]
在algorithm中的二分查詢
首先寫algorithm的標頭檔案 lower bound upper bound binary search 從小到大 函式lower bound 在first和last中的前閉後開區間進行二分查詢,返回大於或等於val的第乙個元素位置。如果所有元素都小於val,則返回last的位置,且last的...
迭代二分查詢二分查詢
在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...
1128 二分 二分查詢
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...