❶ 二分查找演算法
前提要求數據排好序,有遞歸和非遞歸版本
int binSearch(const int *Array,int start,int end,int key)
{
int left,right;
int mid;
left=start;
right=end;
while (left<=right) { /注釋中為遞歸演算法,執行效率低,不推薦
mid=(left+right)/2;
/* if (key<Array[mid]) {
return(binSearch(Array,left,mid,key));
}
else if(key>Array[mid]){
return (binSearch(Array,mid+1,right,key));
}
else
return mid;
*/
if (key<Array[mid]) {
right=mid-1;
}
else if(key>Array[mid]){
left=mid+1;
}
else
return mid;
}
return -1;
}
❷ 二分查找演算法
二分查找演算法,該演算法要求線性表必須採用順序存儲結構,而且表中元素按關鍵字有序排列。如果一個序列是無序的或者是鏈表,那麼該序列就不能使用二分查找。
二分查找演算法原理:若待查序列為空,則返回-1,並退出演算法;若待查序列不為空,則將它的中間元素與目標數值進行比較,判斷是否相等;若相等,則返回中間元素索引,並退出演算法;此時已查找成功。若不相等,則比較中間元素與目標數值的大小。
二分查找的一個技巧是:不要出現else,而是把所有情況用else,if寫清楚,這樣可以清楚地展現所有細節。本文都會使用else,if,旨在講清楚,讀者理解後可自行簡化。
❸ python演算法:二分查找
二分查找: 又稱折半查找 ,輸入一個有序的元素列表(必須是有序的), 將列表中間位置記錄的元素與查找元素比較, 如果查找的元素包含在列表中, 則查找成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的元素大於查找元素,則進一步查找前一子表,否則進一步查找後一子表,重復以上過程,直到找到滿足條件的記錄,使查找成功, 二分查找 返回其位置; 或直到子表不存在為止,此時查找不成功 ,返回None。
二分查找演算法要求 : .必須是有序列表;
二分查找演算法時間復雜度: O(log n)
二分查找演算法優點: 比較的次數少,查找速度快,平均性能好,佔用系統內存較少。
def binary_search(list,item):
low = 0
high = len(list) - 1
while low <= high:
mid = int((low + high)/2) # 整除計算也可用 mid = (low + high)//2
guess = list[mid]
if guess == item:
return mid
if guess < item:
low = mid + 1
else:
high = mid - 1
return None
my_list = [1,3,5,6,8,7,9,12,18,45]
print (binary_search(my_list,2))
print (binary_search(my_list,12))
❹ 二分查找法的具體演算法
折半查找法也稱為二分查找法,它充分利用了元素間的次序關系,採用分治策略,可在最壞的情況下用O(log n)完成搜索任務。它的基本思想是,將n個元素分成個數大致相同的兩半,取a[n/2]與欲查找的x作比較,如果x=a[n/2]則找到x,演算法終止。如果x<a[n/2],則我們只要在數組a的左半部繼續搜索x(這里假設數組元素呈升序排列)。如果x>a[n/2],則我們只要在數組a的右半部繼續搜索x。二分搜索法的應用極其廣泛,而且它的思想易於理解,但是要寫一個正確的二分搜索演算法也不是一件簡單的事。第一個二分搜索演算法早在1946年就出現了,但是第一個完全正確的二分搜索演算法直到1962年才出現。Bentley在他的著作《Writing Correct Programs》中寫道,90%的計算機專家不能在2小時內寫出完全正確的二分搜索演算法。問題的關鍵在於准確地制定各次查找范圍的邊界以及終止條件的確定,正確地歸納奇偶數的各種情況,其實整理後可以發現它的具體演算法是很直觀的,我們可用C++描述如下:
template<class Type>
int BinarySearch(Type a[],const Type& x,int n)
{
int left=0;
int right=n-1;
while(left<=right){
int middle=(left+right)/2;
if (x==a[middle]) return middle;
if (x>a[middle]) left=middle+1;
else right=middle-1;
}
return -1;
}
模板函數BinarySearch在a[0]<=a[1]<=...<=a[n-1]共n個升序排列的元素中搜索x,找到x時返回其在數組中的位置,否則返回-1。容易看出,每執行一次while循環,待搜索數組的大小減少一半,因此整個演算法在最壞情況下的時間復雜度為O(log n)。在數據量很大的時候,它的線性查找在時間復雜度上的優劣一目瞭然。
❺ C#二分查找演算法
二分查找的基本思想是:(設R[low..high]是當前的查找區間)
(1)首先確定該區間的中點位置:mid=(low+high)/2
(2)然後將待晌衫悶查的K值與R[mid].key比較:若相等宴彎,則查找成功並返回此位置,否則須確定新的查找區間,繼續二分查找
//
Source:
public
int
search(int[]
q)
{
int
i,
low
=
0,
high
=
q.Length
-
1,
middle;
Console.Write("請輸入想要查找的數字:");
i=int.Parse(Console.ReadLine());
while
(low
<=
high)
{
middle
=
(low
+
high)
/
2;
if
(i
==
q[middle])return
i;
if
(i
<
q[middle])high
=
middle
-
1;
else
low
=
middle
+
1;
}
throw
new
Exception("數組中不存在這個數塌肢。");
}
❻ 基本演算法——二分查找演算法
二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須採用順序存儲結構,而且表中元素按關鍵字有序排列。
1.條件
(1)必須採用 順序存儲結構 。
(2)必須按關鍵字大小有序排列。
2.步奏
(1)首先,假設表中元素是按升序排列,將表中間位置記錄的 關鍵字 與查找關鍵字比較,如果兩者相等,則查找成功;
(2)否則利用中間位置 記錄 將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找後一子表;
(3)重復以上過程,直到找到滿足條件的 記錄 ,使查找成功,或直到子表不存在為止,此時查找不成功。
3.舉例
有一組元素{1,2,3,4,5,6,7,8,9},如何查到元素為3。
(1)找到數組中中間元素值5,不等於3,所以把數組分為{1,2,3,4},{5,6,7,8,9};
(2)因為5大於3,所以3在前一個數組{1,2,3,4}中查找,中間變數2,3比2大,所以在{3,4}中查詢;
(3)查詢到3=3,成功。
4.復雜度
最好的情況下,1次查詢成功;最壞的情況下,查詢到最後兩個數或者最後也查不到相等數,時間復雜度為O(log2n)。
❼ 二分查找演算法實現(圖解)與實例
當我們要從一個序列中查找一個元素的時候,二分查找是一種非常快速的查找演算法,二分查找又叫折半查找。
它對要查找的序列有兩個要求,一是該序列必須是有序的(即該序列中的所有元素都是按照大小關系排好序的,升序和降序都可以,本文假設是升序排列的),二是該序列必須是順序存儲的。
如果一個序列是無序的或者是鏈表,那麼該序列就不能進行二分查找。之所以被查找的序列要滿足這樣的條件,是由二分查找演算法的原理決定的。
二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查找方法適用於不經常變動而查找頻繁的有序列表。
二分查找能應用於任何類型的數據,只要能將這些數據按照某種規則進行排序。然而,正因為它依賴於一個有序的集合,這使得它在處理那些頻繁插入和刪除操作的數據集時不太高效。這是因為,對於插入和操作來說,為了保證查找過程正常進行,必須保證數據集始終有序。相對於查找來說,維護一個有序數據集的代價更高。此外,元素必須存儲在連續的空間中。因此,當待搜索的集合是相對靜態的數據集時,此時使用二分查找是最好的選擇。
二分查找演算法的原理如下:
二分查找之所以快速,是因為它在匹配不成功的時候,每次都能排除剩餘元素中一半的元素。因此可能包含目標元素的有效范圍就收縮得很快,而不像順序查找那樣,每次僅能排除一個元素。
二分查找法實質上是不斷地將有序數據集進行對半分割,並檢查每個分區的中間元素。
此實現過程的實施是通過變數left和right控制一個循環來查找元素(其中left和right是正在查找的數據集的兩個邊界值)。
二分查找的時間復雜度取決於查找過程中分區數可能的最大值。對於一個有n個元素的數據集來說,最多可以進行O(㏒₂n)次分區。對於二分查找,這表示最終可能在最壞的情況下執行的檢查的次數:例如,在沒有找到目標時。所以二分查找的時間復雜度為O(㏒₂n)。
參考:
https://www.html.cn/qa/other/23018.html
https://www.cnblogs.com/idreamo/p/9000762.html