二分查詢又稱折半查詢,
對排好序的陣列,每次取這個數和陣列中間的數進行比較,複雜度是
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 即要查詢的值 那麼通...