該算法的複雜度爲O(n log n)
2.輸入是一個N×N的數字矩陣並且已經讀入內存。每一行均從左到右增加。每一列則從上到下增加。給出一個O(N)最壞情形算法以確定數X是否在矩陣中。
k是被尋找的數, i,x是橫座標,j,y是縱座標。
1. 如果k> m[i][j]=> 對於所有的元素m[x][y]此時 x> =i, y> =j
2. 如果k=m[i][j]找到
3. 如果k <m[i][j]=> k大於 所有的元素 m[x][y] 此時 x <=i, y <=j
因此只需要構造一種搜索的方法(用圖形比較好理解,不過這兒沒法貼圖):
1. 首先從i=0, j=0開始搜索j,得到最右端的第一個大於k的j,這兒記爲jMax。此時可以推出:如果k存在,那麼k所在的元素m[x][y]必定有x> =i, y <=jMax-1,也就是說必定在(i,jMax)的左下方。
2. 然後從i=0,j=jMax-1開始:
3. 如果k> m[i][j],則++i 因爲此時 x <=i y <=j的元素均小於k,所以可以往下走
4. 如果k <m[i][j],則--j 因此此時x> =i y> =j的元素均大於k,所以只能往左走,往上走不行,因爲上面的數肯定都是大於或者小於k的
5. 第3,4步不斷重複直到找不到或者找到爲止
時間複雜度O(2N)
程序代碼如下:
bool search(int *array, int l, int r, int num)
{
int i=0;
int j=0;
for(;j<r;++j)
{
if(array[i*r + j]>num)
break;
else if(array[i*r + j] == num)
return true;
}
--j;
while(1)
{
if(array[i*r + j]>num) //左走
j--;
else if(array[i*r + j] < num) )//下走
i++;
else
return true;
if(i>=l || j<0) //找不到
return false;
}
return false;
}
調用的search(&m[0][0],N,N,num)
對於二維數組:
(1)兩個維數都不給出,把兩個維數都作爲形參:
void func(double a[][], int dim1,int dim2);
(2)直接將數組名作爲指向指針的指針:
void func(double **a, int dim1,int dim2);
定義二維動態數組來避免上面的問題
這都是錯誤的。因爲,參數聲明a[][]本身就是非法的。因爲,爲了確定元素的位置,多維數組的第二個以後的維都必須知道。一種正確的解決方法是:
void print(int *a, int dim1, int dim2)
{
for(int i=0; i<dim1; i++){
for(int j=0; j<dim2; j++)
cout<<a[i*dim2+j]<<'/t';
cout<<'/n';
}
}
函數調用時的第一個參數是第一個元素的地址
當然可以採用