1. 程式人生 > >二分查詢法的迴圈與遞迴實現及時間複雜度分析

二分查詢法的迴圈與遞迴實現及時間複雜度分析

設陣列為整數陣列,從小到大排序。二分法強調一定是要先排過序的。

迴圈實現二分法程式碼:

#include <iostream>
using namespace std;
int binary_search(int *array,int low ,int high,int target)
{
while(low<=high)
{
int mid=(low+high)/2;
if (array[mid]==target)
{
return mid;
}
else if (array[mid]>target)
{
high=mid-1;
}
else
{
low=mid+1;
}
}
return -1;

}
int binary_search2(int *a,int low,int high,int target)//遞迴實現二分法程式碼:
{
if (low>high)
{
return -1;
}
int mid=(low+high)/2;
if (a[mid]==target)
{
return mid;
}
else if (a[mid]>target)
{
return binary_search2(a,low,mid-1,target);
}
else
{
return binary_search2(a,mid+1,high,target);
}

}
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int n=binary_search(a,0,9,5);
int m=binary_search2(a,0,9,5);
return 0;

}

二分查詢的基本思想是將n個元素分成大致相等的兩部分,去a[n/2]與x做比較,如果x=a[n/2],則找到x,演算法中止;如果x<a[n/2],則只要在陣列a的左半部分繼續搜尋x,如果x>a[n/2],則只要在陣列a的右半部搜尋x.

時間複雜度無非就是while迴圈的次數!

總共有n個元素,

漸漸跟下去就是n,n/2,n/4,....n/2^k,其中k就是迴圈的次數

由於你n/2^k取整後>=1

即令n/2^k=1

可得k=log2n,(是以2為底,n的對數

所以時間複雜度可以表示O()=O(log2n)

相關推薦

二分查詢迴圈實現時間複雜分析

設陣列為整數陣列,從小到大排序。二分法強調一定是要先排過序的。 迴圈實現二分法程式碼: #include <iostream> using namespace std; int binary_search(int *array,int low ,int hi

二分查詢(折半查詢)演算法(原理、實現時間複雜

查詢也是有特殊情況的,比如數列本身是有序的。這個有序數列是怎麼產生的呢?有時它可能本身就是有序的,也有可能是我們通過之前所學的排序演算法得到的。 不管怎麼說,我們現在已經得到了有序數列了並需要查詢。這時二分查詢該出場了。 二分查詢(Binary Search)也叫作折半查詢。二分查詢有兩個要求,一個是數列

演算法的時間複雜分析

在演算法分析中,當一個演算法中包含遞迴呼叫時,其時間複雜度的分析會轉化為一個遞迴方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞迴方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法:     (1)代入法(Substitution Method)  

堆排序的JAVA實現時間複雜分析

堆排序是一個比較常用的排序方式,下面是其JAVA的實現: 1. 建堆 // 對輸入的陣列進行建堆的操作 private static void buildMaxHeap(int[] array, int length) { // 遍歷所有

樹——藉助樹來求解演算法的時間複雜

遞迴程式碼的時間複雜度分析起來非常麻煩,今天我們嘗試來藉助遞迴樹分析遞迴演算法的時間複雜度。 1. 遞迴樹與時間複雜度分析 遞迴的思想就是將大問題一層一層地分解為小問題來求解,如果我們把這個分解過程畫成圖,它其實就是一棵樹,我們稱之為遞迴樹。 上圖為斐波那契數列的遞迴樹,節點裡的數字表示資

【資料結構演算法-java實現】二 複雜分析(下):最好、最壞、平均、均攤時間複雜的概念

上一篇文章學習了:如何分析、統計演算法的執行效率和資源消耗? 點選連結檢視上一篇文章:複雜度分析上 今天的文章學習以下內容: 最好情況時間複雜度 最壞情況時間複雜度 平均情況時間複雜度 均攤時間複雜度 1、最好與最壞情況時間複雜度 我們首先

分塊查詢演算法完全攻略(原理、實現時間複雜

一般對於需要查詢的待查資料元素列表來說,如果很少變化或者幾乎不變,則我們完全可以通過排序把這個列表排好序以便我們以後查詢。但是對於經常增加資料元素的列表來說,要是每次增加資料都排序的話,那真的是有點太累人了。 所以之前我們分析過,對於幾乎不變的資料列表來說,排序之後使用二分查詢是很不錯的,但是對於經常變動的

順序查詢演算法(原理、實現時間複雜

一提到查詢,比如從一個數列中查詢第1個值為k的數,那麼我們最先想到的肯定是一個一個地找。從數列的第 1 個數開始對比,直到找到值為k的數。 順序查詢的定義為:在一個已知無序(或有序)的佇列中找出與給定的關鍵字相同的數的具體位置。其原理是讓關鍵字與佇列中的數從開始一個一個地往後逐個比較,直到找到與給定的關鍵字

樹求解演算法的時間複雜

  遞迴演算法時間複雜度的計算方程式一個遞迴方程:      在引入遞迴樹之前可以考慮一個例子:   T(n) = 2T(n/2) + n2   迭代2次可以得:   T(n) = n2 + 2(2T(n/4) + (n/2) 2)   還可以繼續迭代,將其完全

分析演算法的時間複雜

T(n) = T(n/3) + T(2n/3) + n   其遞迴樹如下圖所示:      可見每層的值都為n,從根到葉節點的最長路徑是:      因為最後遞迴的停止是在(2/3)kn == 1.則        於是        即T(n) = O

演算法的時間複雜計算

在演算法分析中,當一個演算法中包含遞迴呼叫時,其時間複雜度的分析會轉化為一個遞迴方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞迴方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法:     (1)代入法(Substitution Metho

(轉)樹求演算法的時間複雜

  遞迴演算法時間複雜度的計算方程式一個遞迴方程:      在引入遞迴樹之前可以考慮一個例子:   T(n) = 2T(n/2) + n2   迭代2次可以得:   T(n) = n2 + 2(2T(n/4) + (n/2) 2)   還可以繼續迭代,將

演算法的時間複雜

遞迴演算法應該都不陌生,其實最開始遇見遞迴應該是在數學課上,類似於f(x)=f(x-1)+f(x+1),f(1)=1,f(2)=4,f(3)=3這種數學題大家應該見過不少,其實思想就是層層遞迴,最終將目標值用f(1),f(2),f(3)表示。 之前做了一個需求,需要實現類似作業系統資料夾的功能,我們用MySQ

常見排序演算法的基本原理、程式碼實現時間複雜分析

  排序演算法無論是在實際應用還是在工作面試中,都扮演著十分重要的角色。最近剛好在學習演算法導論,所以在這裡對常見的一些排序演算法的基本原理、程式碼實現和時間複雜度分析做一些總結 ,也算是對自己知識的鞏固。 說明: 1.本文所有的結果均按照非降序排列; 2.本文所有的程式均用c++實現,

排序演算法——希爾排序的圖解、程式碼實現以及時間複雜分析

希爾排序(Shellsort) 希爾排序是衝破二次時間屏障的第一批演算法之一。 希爾排序通過比較相距一定間隔的元素來工作;各躺比較所用的距離隨著演算法的進行而減小,直到只比較相鄰元素的最後一趟排序為止。由於這個原因,希爾排序有時也叫做縮減增量排序。 希爾排

九大排序演算法的手寫實現時空複雜分析

一、氣泡排序  氣泡排序是一種簡單的排序方法,演算法如下:  1. 首先將所有待排序的數字放入工作列表中。  2. 從列表的第一個數字到倒數第二個數字,逐個檢查:若某一位上的數字大於他的下一位,則將它與它的下一位交換。  3. 重複2號步驟(倒數的數字加1。例

九大排序演算法的手寫實現時空複雜分析 筆試面試必備

一、氣泡排序 氣泡排序是一種簡單的排序方法,演算法如下: 1. 首先將所有待排序的數字放入工作列表中。 2. 從列表的第一個數字到倒數第二個數字,逐個檢查:若某一位上的數字大於他的下一位,則將它與它的下一位交換。 3. 重複2號步驟(倒數的數字加1。例如

快速排序實現以及時間複雜分析

平均時間複雜度分析: T(1) = 1; T(n) = 2*T(n/2) + a*n;(a為常數,每次合併時,複雜度為O(n)) = 2*(2*T(n/4)+a*n/2) + a*n = 4*T(n/4) + 2*a*n = 4*(2*T(n/8)+a*n/4) + 2*a*n = 8*T(n/8) + 3

排序演算法——插入排序的圖解、程式碼實現以及時間複雜分析

插入排序 插入排序的原理: 插入排序由N-1躺排序完成,對於p=1到N-1躺,插入排序保證從位置0到位置p的元素為已排序狀態。 插入排序的程式碼實現: /** * 插入排序的實現例程,特點是使用了泛型,可以接受任何實現了Compa

演算法(第4版) 學習筆記二——二分查詢的普通實現實現

以查詢某個特定元素在已排序陣列中的索引為例,且此陣列為從小到大排序。 演算法思路: 1、取第一個索引和最後一個索引代表兩個遊標,一個lo,一個hi 2、取lo和hi的中間值,即為mid,如下圖所示