/* 在由n個數組成的序列中,找出最長的單調遞增子串行。子串行是連續的 */
#include
using namespace std;
template
void arrcopy ( const t arrsource,
const int& startposition,
t *& arrdestination,
const int& count )
arrdestination = new t[count];
int pos = 0;
for ( int i = startposition; i < startposition+count; ++i )}
template
void printarr ( const t arr,
const int& size )
cout << endl;}
template
void getmaxincsubarr( const t arr, // 源序列
const int& size, // 源序列的長度
t *& sub, // 生成的子串行
int& subsize ) // 子串行的長度
// 確定tempsubsize的值
int tempsubsize = 1;
int pointer = size >> 1; // pointer指向源序列的中部
while( pointer + 1 < size &&
arr[pointer+1] > arr[pointer] )
pointer = size >> 1; // 指示器重新指向源序列的中部
while( pointer > 0 &&
arr[pointer-1] < arr[pointer] )
// pointer現在指向了位於源序列中部的單調遞增子串行的首元素
if ( tempsubsize > subsize )
int * left = 0; // left是位於源序列中部的單調遞增子串行的左邊部分
int leftsize = pointer;
if ( leftsize > subsize )
int * right = 0; // right是位於源序列中部的單調遞增子串行的右邊部分
int rightsize = size - pointer - subsize;
if ( rightsize > subsize )
if ( pointer > subsize )
if(rightsize > subsize)}
int main(int argc, char* argv)
;int size = sizeof(arr)/sizeof(int);
int* sub = 0;
int subsize = 0;
getmaxincsubarr
cout << subsize << endl;
printarr
delete sub;
cin.get();
return 0;}
尋找假幣問題(二分法)
有n個硬幣,編號為1 n,其中有乙個假幣,且假幣較輕,如何採用天平稱重方式找到這個假幣?可採用如下的分治演算法解決這個問題 如果n為偶數,則將這n個硬幣分成兩等份,並將兩份硬幣放到天平兩端,假幣在較輕的那端 2,如果n為奇數,則取出第1個硬幣後將其餘硬幣分成兩等份,並將兩份硬幣放到天平兩端 2.1 ...
用二分法查詢迴圈遞增序列 Python
問題 使用二分法在迴圈遞增序列中查詢指定元素,返回其下標 若不存在,則返回 1.要求時間複雜度為 o logn 迴圈遞增序列的定義 nums 7,8,9,10,1,2,3,4,5,6 即,乙個序列被分為兩個子串行,每個子串行都是遞增的,並且如果在指定位置 如 10 1 之間 切斷重組,則可以變為遞增...
C 二分法查詢,遞迴二分法
用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...