二分搜尋法
| 1 | 2 | 3 | 5 | 6 |
|---|
| 20 | 30 | 87 | 99 | 256 |
|---|
序列 \(\{a_i\}\) 就是一個有序資料
有數列\(a_1,a_2,a_3,\cdots,a_n\),想要做一些事
int a[5] = {55, 60, 70, 75, 99};
int x = 100;
int index = -1;
for(int i=0; i<5; ++i)
{
if( a[i] == x )
index = i;
}
printf("data at %d", index);好像有點浪費時間?如果資料有神奇的特性呢?
| 小於x | 等於x | 大於x |
|---|
\(<_+\)
\(<_+\)
\(<_+\)
\(<_+\)
| 1 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 |
|---|
小於6
大於6
\(<_+\)
\(<_+\)
| 1 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 |
|---|
小於6
大於6
\(<_+\)
\(<_+\)
| 1 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 |
|---|
小於6
大於6
| 1 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 |
|---|
| 1 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 |
|---|
| 1 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 |
|---|
| 1 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 |
|---|
int a[100], x;
int L = 0; // 資料的最左邊
int R = N-1; // 資料的最右邊
int index = -1; // 找到的位置int a[100], x;
int L = 0; // 資料的最左邊
int R = N-1; // 資料的最右邊
int index = -1; // 找到的位置
while( L<=R ) // 在範圍有東西的狀況下
{
}int a[100], x;
int L = 0; // 資料的最左邊
int R = N-1; // 資料的最右邊
int index = -1; // 找到的位置
while( L<=R ) // 在範圍有東西的狀況下
{
int M = (L+R)/2; //中間點
}int a[100], x;
int L = 0; // 資料的最左邊
int R = N-1; // 資料的最右邊
int index = -1; // 找到的位置
while( L<=R ) // 在範圍有東西的狀況下
{
int M = (L+R)/2; //中間點
if( a[M] < x ) L=M+1; //戳到左邊,比 M 小的都不是答案
}int a[100], x;
int L = 0; // 資料的最左邊
int R = N-1; // 資料的最右邊
int index = -1; // 找到的位置
while( L<=R ) // 在範圍有東西的狀況下
{
int M = (L+R)/2; //中間點
if( a[M] < x ) L=M+1; //戳到左邊,比 M 小的都不是答案
else if( x < a[M] ) R=M-1; //戳到右邊,比 M 大的都不是答案
}int a[100], x;
int L = 0; // 資料的最左邊
int R = N-1; // 資料的最右邊
int index = -1; // 找到的位置
while( L<=R ) // 在範圍有東西的狀況下
{
int M = (L+R)/2; //中間點
if( a[M] < x ) L=M+1; //戳到左邊,比 M 小的都不是答案
else if( x < a[M] ) R=M-1; //戳到右邊,比 M 大的都不是答案
else { index = M; break; } //找到答案!
}int a[100], x;
int L = 0; // 資料的最左邊
int R = N-1; // 資料的最右邊
int index = -1; // 找到的位置
while( L<=R ) // 在範圍有東西的狀況下
{
int M = (L+R)/2; //中間點
if( a[M] < x ) L=M+1; //戳到左邊,比 M 小的都不是答案
else if( x < a[M] ) R=M-1; //戳到右邊,比 M 大的都不是答案
else { index = M; break; } //找到答案!
}AC
WA / TLE
這份 Code 有一個 bug (while迴圈內)
int M = (L+R)/2;
L = 2147483646, R = 2147483647
可改寫為
int M = L+(R-L)/2;