深入理解不同的二分查詢C

2021-08-09 01:19:02 字數 1352 閱讀 3891

以任一元素s[mid] = x為界,都可將區間分為三部分,且根據此時的有序性必有:

// 二分查詢演算法(版本a):在有序向量區間[low, high)內查詢元素e,0

<= lowwhile (low < high) //成功查詢可以提前終止

return -1;//查詢失敗

}

只需將目標元素e與x做一比較,即可視比較結果分三種情況做進一步處理:

(1)若e 《x,則目標元素如果存在,必屬於左側子區間s[low, mid),故可深入其中繼續查詢;

(2)若x < e,則目標元素如果存在,必屬於右側子區間s(mid, high),故也可深入其中繼續查詢;

(3)若e = x,則意味著已經在此處命中,故查詢隨即終止

這個方法就是在之前方法基礎上把取中點換成了取**分割點,演算法效率比之前的更高,不詳細介紹。

與二分查詢演算法的版本a基本類似。不同之處是,在每個切分點a[mid]

處,僅做一次元素比較。具體地,若目標元素小於a[mid],則深入前端子向量a[low, mid)繼續查

找;否則,深入後端子向量a[mid, high)繼續查詢

< high - low) //出口時high = low + 1,查詢區間僅含乙個元素a[low]

return (e == a[low]) ? low : -1 ;//查詢成功時返回對應秩;否則統一返回-1

}優點:從三分支到兩分支,進一步提高了演算法效率

每次轉入後端分支時,子向量的左邊界取作mid + 1而不是mid

迴圈結束之後,無論成功與否,只需返回low - 1即可

效率進一步提高

while (low < high) //成功查詢能提前終止

return

--low; //迴圈結束時,low為大於e的元素的最小秩,故low - 1即大於e的元素的最大

}

C 繼承深入理解(二)

多繼承 乙個派生類繼承多個基類 include include using namespace std class base1 3.隱藏 派生類重新定義基類的方法 1.函式名 引數完全與基類一樣 2.函式名相同 引數不同 這兩種情況都叫隱藏 隱藏與過載區別 1.過載在統一類作用域,隱藏在不同類作用域...

c語言深入理解(二)

1.void關鍵字的作用 void的字面意思是空型別,void 可以指向任何資料型別的資料。void的發揮作用在於 對函式返回值的限定,對函式引數的限定。void 則不同,任何型別的指標都可以直接賦值給他不必進行強制轉換,但void 並不意味著可以直接賦值給任何型別。2.按照ansi標準,不能對vo...

二分查詢演算法的理解

在做lis的o nlgn 演算法時,用到了二分查詢演算法。對於其中的一些條件,例如 l二分查詢因為有幾個限制,其中乙個便是 單調序列 這個要求,所以可能出現 2 3 4 4 4 5 6這樣的陣列,那麼返回第乙個出現的位置便是 i 3時。i0 1234 56a i 23 4445 6while lef...