二分法在演算法中應用廣泛,經常見到其在折半插入排序(穩定)和折半查詢**現。但是我對其細節之處有不解之處,特來總結。
void binsertsort( int * a, int len)
else
} int v = a[i];
for (int j = i; j > low; j--)
a[low] = v;
}}
每一次插入都需要定位到插入位置,該演算法定位到的兩個位置low
和high
,這兩個值相差1,即 low = high +1 因為排序是穩定的,所以插入值v
滿足 a[h
igh]
≤vlow]
a[high] \le v < a[low]
a[high]≤v
low]
。這樣關於穩定性,如果有序數列有多個v
,就可以定位到上邊界,後插入的會在相同值的後面,從而保證了穩定。
int binarysearch(int * a, int len, int v)
else if (a[mid] < v)
else
return -1;
}}該演算法返回查詢值的索引,如果沒找到就返回-1
,這裡是查詢到就返回,那麼如果要查詢所有的該怎麼做呢?
對於有序陣列,該如何查詢全部符合條件的索引呢?我們查詢到上邊界和下邊界,兩個索引之間即為要查詢的目標。
void findallbinary(int * a, int len, int v)
else
} int top = high;
low = 0, high = len - 1;
while (low <= high)
else
} int bot = low;
printf("bot:%d,top:%d\n", bot, top);
// 查詢的索引在bot 和 top之間
if (bot > top)
printf("沒有查到索引\n");
else if (bot == top)
printf("只有乙個索引符合%d\n",bot);
else
printf("索引範圍[%d,%d]\n", bot,top);
}
用二分法來查詢乙個大於等於p
的最小整數,範圍在[1,1000],p
具體的值在黑盒子中不知道,但是可以通過函式來指定乙個整數v
與其比較,返回v
是否小於p
.
float p = 6.9;
int binarymaxvalue()
else
}return low;
}
對我來說,二分法的難點在於判斷上下邊界,類似於第3節中的「查詢所有索引」。
邊界判斷**
[low,high]值
上邊界a[mid] > 5
[4,3]
下邊界a[mid] < 5
[1,0]
查詢演算法 二分法
二分查詢演算法的基本思想 一.首先確定該區間的中間元素位置 mid low high 2 mid代表區間內中間元素的位置 low代表區間內最左邊元素的位置 high代表區間內最右邊元素的位置 二.將待查key元素值與中間元素mid的值 array mid 比較,如果相等,則查詢成功,否則確定新的查詢...
演算法 二分法查詢
1 2 二分法實驗 31 設a 0 n 1 是乙個已排好序的陣列.4請改寫二分搜尋演算法,使得當搜尋元素x不在陣列中時,5返回小於x的最大元素的位置i和大於x的最大元素位置j.6當搜尋元素在陣列中時,i和j相同,均為x在陣列中的位置.72 設有n個不同的整數排好序後存放於t 0 n 1 中,8若存在...
演算法 二分法查詢
免費 二分法查詢主要是為了快速查詢給定陣列內,期待值在陣列中的位置 下標 二分法查詢通過對整個陣列取中間值,判斷期待值所在的範圍並縮小範圍,每次查詢範圍折半,直到範圍的邊界重合,得出期待值的位置,如果找不到返回null 二分法有乙個先決條件是 陣列內元素必須是有序的 給定乙個包含1,3,5,7,8,...