二分查詢之C 實現詳解

2021-10-01 12:39:11 字數 2384 閱讀 1997

二分查詢是對有序陣列(向量)而言的,所以在使用二分查詢前要確保陣列已經是順序的(用到排序演算法)。

聚會時通常會玩猜數字的遊戲:

先由坐莊的人來寫乙個數字(比如在1~1000之內)

讓大家輪流猜,並告訴大家正確數字比當前猜的數字大或者小

每猜一次範圍就會縮小,最後猜中的人倒霉挨罰

二分查詢要求只能猜中位數,每次讓猜的範圍縮小一半,這樣很快就能猜中,也即很快能獲得查詢結果。

通過每次選取位於當前範圍的中間元素與要查詢的元素進行比較,讓每次查詢範圍縮小一半,從而迅速獲得查詢結果。

我們進行查詢操作時的目的是在乙個陣列中或者在陣列的某一範圍中找到是否有這個元素,如果有就獲取這個元素所在的位置,如果沒有就告訴我們沒有。這樣就有了查詢操作的輸入輸出。

查詢操作的輸入:要查詢的陣列a,要查詢的元素a,查詢範圍[lo,hi)    注意是左閉右開的區間

查詢操作的輸出:如果查詢成功返回元素所在位置(即編號、下標),如果失敗返回-1(通常約定,-1表示所進行的操作失敗了)

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace binsearch

program ps = new program();

ps.bubblesortb(ref a);

console.writeline("排序結果:");

foreach (int a in a)

int key = ps.binsearch(a, 10, 0, a.length);

console.writeline("\n查詢結果:"+key);

console.readkey();

}public int binsearch(inta,int a, int lo,int hi)//查詢範圍[lo,hi)

else if (a == a[middle])

else

}return -1;

}//氣泡排序

如果我們要查詢的元素在陣列中有多個,該怎麼辦呢?

上文現實的演算法是返回任意乙個元素位置即可,如果要返回最大的位置或者最小的位置呢?也即我們對輸出增加了一條新的要求,如果有多個相同元素,返回元素最大(或者最小)的位置。

最簡單的方法是先找到有目標元素的位置,再在這個元素左邊找最小的位置,右邊找最大的位置。

public int binsearch2(int a, int a, int lo, int hi)//查詢範圍[lo,hi)

else if (a == a[middle])

else

}//獲得最小的位置

//while(key-1>-1&&a == a[key - 1])

// key--;

//獲得最大的位置

有其他輸出要求時,如:查詢第乙個大於等於某個數的位置;查詢陣列中某個數的最小位置,沒有返回-1;查詢陣列中某個數的出現次數等,在不特意要求效率的情況下,都可以用上述改進思路順暢實現。

要求輸出:如果有相同的元素,返回元素的最大位置。如果沒找到元素,返回小於且距離該元素最近的元素的位置。

public int binsearch3(int a, int a, int lo, int hi)//查詢範圍[lo,hi)

[1]鄧俊輝.資料結構(c++版)第三版

[2][3]

c 實現二分查詢

二分查詢又稱折半查詢,對排好序的陣列,每次取這個數和陣列中間的數進行比較,複雜度是 o logn 如 設陣列為 a n 查詢的數x,如果x a n 2 則返回 n 2 如果 x a n 2 則在 a 0 到a n 2 1 中進行查詢 如果x a n 2 則在a n 2 1 到a n 1 中進行查詢 ...

c 實現二分查詢

二分查詢又稱折半查詢,對排好序的陣列,每次取這個數和陣列中間的數進行比較,時間複雜度是o logn 設陣列為a n 查詢的數x,如果x a n 2 則返回n 2 如果x a n 2 則在a 0 到a n 2 1 中進行查詢 如果x a n 2 則在a n 2 1 到a n 1 中進行查詢 優點是比較...

C 實現二分查詢

所謂的二分查詢,在一組遵循一定規律的數中查詢自己想要的數,這裡以一組從小到大排好的陣列為例進行二分查詢,二分思想如下 假設你要找 n 那麼先讓 n 與陣列中間的數比較,縮小一半區間,如果 n 比中間的數大,那麼以後半部分作為新的查詢區間,讓 n 與新區間的中間數比較,再根據大小重新縮小一半的區間,直...