二分法在查詢 排序演算法中的應用

2021-10-19 12:46:34 字數 1714 閱讀 4823

二分法在演算法中應用廣泛,經常見到其在折半插入排序(穩定)和折半查詢**現。但是我對其細節之處有不解之處,特來總結。

void binsertsort( int * a, int len)

else

} int v = a[i];

for (int j = i; j > low; j--)

a[low] = v;

}}

每一次插入都需要定位到插入位置,該演算法定位到的兩個位置lowhigh,這兩個值相差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,...