1. 程式人生 > >二分查詢法(C++ 模板實現)

二分查詢法(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