二分查詢法(C++ 模板實現)
/*演算法總結 二分查詢法: 二分查詢法的前提是資料已經排序,時間平均複雜度為 O(lgn) 歡迎轉載,轉載請註明作者 [email protected] */ #include <iostream> #include <stdio.h> using namespace std; #include <vector> using std::vector; #include <algorithm> /** * @brief binarySearch 二分查詢 * @param array 排序後的陣列 * @param value 待查詢的引數 * @return true on success ,false on failure */ template<typename T> bool binarySearch(vector<T> &array,T value) { int low = 0; int high = array.size () -1; while ( low <= high ) { int middle = ( low + high ) /2; if ( array[middle] == value ) { return true; } else if ( array[middle] > value ) { high = middle - 1; } else if ( array[middle] < value ) { low = middle + 1; } } return false; } void unitTest() { vector<int> vec; for ( int i = 0 ; i < 100 ; i += 2 ) { vec.push_back (i); } bool result = binarySearch<int>(vec,29); cout << "search result for [29] " << result<<endl; result = binarySearch<int>(vec,16); cout << "search result for [16] " << result<<endl; vector<string> strVect; strVect.push_back ("world"); strVect.push_back ("hello"); strVect.push_back ("b"); strVect.push_back ("a"); strVect.push_back ("i love cpp"); sort(strVect.begin (),strVect.end ()); result = binarySearch<string>(strVect,"notfind"); cout << "search result for [notfind] " << result<<endl; result = binarySearch<string>(strVect,"world"); cout << "search result for [world] " << result<<endl; } int main(int argc, char *argv[]) { unitTest (); return 0; }
下面是遞迴的實現
#include<iostream>
usingnamespacestd;
template<typenameT>
int
bSearch(Tarray[],Tvalue,intstart,intend)
{
if(start>end)
{
return-1;
}
intmiddle=(start+end)/2;
if(array[middle]==value)
{
returnmiddle;
}
elseif(array[middle]>value)
{
returnbSearch(array,value,start,middle-1);
}
elseif(array[middle]<value)
{
returnbSearch(array,value,middle+1,end);
}
}
intmain(intargc,char*argv[])
{
intarray[]={1,2,3,4,5,6,7,8,10,12,32,45};
intindex=bSearch(array,7,0,sizeof(array)/sizeof(array[0])-1);
cout<<index<<""<<array[index]<<endl;
index=bSearch(array,12,0,sizeof(array)/sizeof(array[0])-1);
cout<<index<<""<<array[index]<<endl;
return0;
}
相關推薦
二分查詢法(C++ 模板實現)
/*演算法總結 二分查詢法: 二分查詢法的前提是資料已經排序,時間平均複雜度為 O(lgn) 歡迎轉載,轉載請註明作者 [email protected] */ #include <iostream> #include <stdi
java——實現二分查詢法
二分查詢又稱折半查詢,它是一種效率較高的查詢方法。 折半查詢的演算法思想是將數列按有序化(遞增或遞減)排列,查詢過程中採用跳躍式方式查詢,即先以有序數列的中點位置為比較物件,如果要找的元素值小 於該中點元素,則將待查序列縮小為左半部分,否則為右半部分。通過一次比較,將查詢區間縮小一半。 折半
[C++]二分查詢法
引用:https://baike.baidu.com/item/%E4%BA%8C%E5%88%86%E6%B3%95/1364267?fr=aladdin 二分法 對於區間上連續不斷且的函式,通過不斷地把函式的零點所在的區間一分為二,使區間的兩個端點逐步逼近零點,進而得到零
使用二分查詢法,查詢ip所在的範圍對應的code(語言為java\scala\python) java語言來實現
使用二分法實現查詢ip所在的範圍,並返回對應的id start_ip end_ip code 0.0.0.0 1.0.0.255 1000000000 1.0.1.0 1.0.3.255 1156350100 1.0.4.0 1.0.7.255 1036000000 1
(旋轉陣列問題)給定一個整數型別的迴圈有序陣列,求迴圈陣列的特定值,使用二分查詢法(JAVA實現)
問題:請實現以下函式int indexOf(int [] array ,int key) ,給定一個迴圈有序的陣列,請在這個陣列中找到指定元素,找到的話返回下標,沒找到返回-1。: 解決:首先,使用二分查詢找到陣列的 “臨界點”,臨界點滿足兩個情況:
二分查詢法的實現和應用匯總
到目前位置,似乎我們學到的演算法中,時間複雜度是O(log n),好像就數二分查詢法,其他的諸如排序演算法都是 O(n log n)或者O(n2)。但是也正是因為有二分的 O(log n), 才讓很多 O(n2)縮減到只要O(n log n)。 關於二分查詢法 二分查詢法主要是解
二分查詢法的迴圈與遞迴實現及時間複雜度分析
設陣列為整數陣列,從小到大排序。二分法強調一定是要先排過序的。 迴圈實現二分法程式碼: #include <iostream> using namespace std; int binary_search(int *array,int low ,int hi
java 實現二分查詢法
/** * 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。 【二分查詢要求】:1.必須採用順序儲存結構 2.必須按關鍵字大小有序排列。 * @author Administrator * */ public class BinarySearch { p
二分查詢法(遞迴和非遞迴實現)
二分查詢法: 二分查詢法又稱折半查詢法,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。(借鑑百度百科)時間複雜度為:log2n,即log以2為底,n的對數。
資料結構用遞迴和非遞迴方法實現二分查詢法
二分查詢法說的通俗一點就是折半查詢,每查詢一次,所對應的元素就會減少一半,所以這種方法的優點就是比較的次數少,查詢的速度快。但其最大的缺點就是插入資料比較困難。所以在面對資料一直會發生變動的列表,就不推薦用二分查詢法了。 那麼下面就來實際介紹一下
二分查詢法的基本思想與實現程式碼
二分查詢法思想: 二分查詢法又稱夾逼法,二分查詢法使用的基本條件是一個有序的陣列,通過從陣列頭部和尾部折半,判斷要查詢的數和mid位置數值的大小,來判斷要查詢的數實在那一半,之後繼續折半查詢,直至找到這個數或者最後小端大於大段則結束查詢 二分查詢法程式碼:#include
Java實現二分查詢法
二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按升序排列,將表
實現 sqrt(x):二分查詢法和牛頓法
最近忙裡偷閒,每天刷一道 LeetCode 的簡單題保持手感,發現簡單題雖然很容易 AC,但若去了解其所有的解法,也可學習到不少新的知識點,擴充套件知識的廣度。 創作本文的思路來源於:LeetCode Problem 69. x 的平方根 簡述題目大意(不想跳轉連結,可以看這裡):給定一個非負整數 x,要求計
[轉] A*尋路算法C++簡單實現
track pos endpoint 障礙 close math.h 不存在 rec 節點 參考文章: http://www.policyalmanac.org/games/aStarTutorial.htm 這是英文原文《A*入門》,最經典的講解,有demo演示 ht
排序算法C語言實現——冒泡排序
int ram 這一 -i 循環 一點 lag 開始 冒泡 /*冒泡O(n^2)*/ /*原理: 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。 針
(java)leetcode852 山脈陣列的封頂索引(二分查詢法找出陣列中最大值的下標)(Peak Index in a Mountain Array)
題目描述: 我們把符合下列屬性的陣列 A 稱作山脈: A.length >= 3 存在 0 < i < A.length - 1 使得A[0] < A[1] < ... A[i-1] < A
二分查詢法(二)
// 二分查詢 public static int helf() { int a[] = { 21, 23, 30, 35, 36, 41, 42, 45, 55, 59, 72 }; int low = 0; int num =
java---二分查詢法
/** * 二分查詢法 * 注: 陣列元素必須有順序 * */ public class sort4 { public static void main(String[] args) { int [] arr ={1,2,3,4,5,6,7,8}; int a = binary
二分查詢的兩種實現(Java)
查詢過程 首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功
二分查詢法示例
1024個人,有一個人有艾滋病。需要血液檢測。 如何快速找出這個人。 所有人血液都採取過來。把512個人血液混合起來 512 512 1次淘汰512個人 256 256 2次淘汰256個人 128 128 3次淘汰128個人 64 32 16 4 2 1 &n