c 實現二分查詢

2021-06-19 05:56:16 字數 1990 閱讀 3288

二分查詢又稱折半查詢,

對排好序的陣列,每次取這個數和陣列中間的數進行比較,複雜度是

o(logn)如:

設陣列為

a[n],查詢的數x,

如果x==a[n/2]

,則返回

n/2; 如果

x < a[n/2],則在

a[0]

到a[n/2-1]

中進行查詢;

如果x > a[n/2]

,則在a[n/2+1]

到a[n-1]

中進行查詢;

優點是比較次數少,查詢速度快,平均效能好;其

缺點是要求待查表為有序表,且插入刪除困難。

條件:查詢的陣列必須要為有序陣列。

/*

歸的二分查詢

arrat:陣列 , low:上界; high:下界; target:查詢的資料; 返回target所在陣列的下標

*/int binarysearch(int array, int low, int high, int target)

if(target == array[middle])

if(target < array[middle])

if(target > array[middle])

}

/*

非遞迴的二分查詢

arrat:陣列 , n:陣列的大小; target:查詢的資料; 返回target所在陣列的下標

*/int binarysearch2(int array, int n, int target) else if(target < array[middle]) else if(target > array[middle])

} return -1;

}

推薦使用非遞迴的方式,因為遞迴每次呼叫遞迴時有用堆疊儲存函式資料和結果。

能用迴圈的盡量不用遞迴。

c++如何跳出多層迴圈

》中提到的抽籤問題進行分析。 4

),資料大時其計算量會大的驚人。為便於分析,將之前**帖至如下:

**抽籤問題

解決方案,複雜度n^4

*/ void drawlots()

bool result = false;

bool isbreakloop = true;

int _sum = 0;

for(int a = 0; a < numofcard && isbreakloop; a ++) }}

}}

cout << "_sum:" << _sum << " " << "sum:" << sum << endl;

if(result)

//對陣列進行排序

sort(k, k + numofcard);

int index = -1;

bool isbreakloop = true;

for(int a = 0; a < numofcard && isbreakloop; a ++) }}

} if(index >= 0)

int cdnum = numofcard*(numofcard+1)/2;

int cdsum[cdnum];

int i = 0;

for(int a=0; a= 0) }}

} if(index >= 0)

int cdnum = numofcard*numofcard;

int cdsum[cdnum];

for(int a=0; a= 0) }}

} if(index >= 0){

cout<<"yes"<

c 實現二分查詢

二分查詢又稱折半查詢,對排好序的陣列,每次取這個數和陣列中間的數進行比較,時間複雜度是o logn 設陣列為a n 查詢的數x,如果x a n 2 則返回n 2 如果x a n 2 則在a 0 到a n 2 1 中進行查詢 如果x a n 2 則在a n 2 1 到a n 1 中進行查詢 優點是比較...

C 實現二分查詢

所謂的二分查詢,在一組遵循一定規律的數中查詢自己想要的數,這裡以一組從小到大排好的陣列為例進行二分查詢,二分思想如下 假設你要找 n 那麼先讓 n 與陣列中間的數比較,縮小一半區間,如果 n 比中間的數大,那麼以後半部分作為新的查詢區間,讓 n 與新區間的中間數比較,再根據大小重新縮小一半的區間,直...

C 實現二分查詢演算法

想必二分查詢很多人都不陌生,或許說很熟悉,但是在實際生活中又有很多人不能正確的寫出它的相應 因為二分查詢的邊界條件等很難控制,下面我們來仔細的分析一下二分查詢,這只是個人看法,如有異議,歡迎提出。1 二分查詢可以解決的問題 二分查詢可以解決預排序陣列的查詢問題。只要陣列中包含t 即要查詢的值 那麼通...