1.二位數組存儲方式:
第一,數組元素在內存中是順序、連續存儲的。
第二,matrix是一個二維數組,二維數組在內存中是按行存放的,即先放第1行,再放第2行……每行中的元素是按列下標由小到大的次序存放,這樣的存儲方式也稱爲行優先存儲。
第三,這裏定義的數組 int *matrix是一個指針數組,指針數組的每個元素都是指針變量。舉個例子,如果一個4行4列的二維指針數組,那麼他的第2行第3列(row=1,column=2),也就是存儲的位置就是row*4+column,即1*4+2=6,存儲在第六個位置(位置下標從0開始),那麼獲得該元素的表示即爲matrix[1*4+2].
2.二位數組的初始化
默認初始化:int a[10][10]={0};
全部初始化:
int matrix[4][4]={
{1,2,8,9},
{2,4,9,12},
{4,7,10,13},
{6,8,10,15}
};
3.二位數組應用:二位數組的查找
有一個二位數組從左到右,從上到下依次增大,如何查找某數字是否存在於數組中?
思路:從右上角或左下角開始尋找
ps:爲什麼不能從左上角或右下角開始尋找?
因爲在左上角比如第一個數的位置,如果尋找的數7比第一行第一列的數1要大,那麼它下一個比較的是第一行第二列的數還是第二行第一列的數呢?那就會有重疊。而從右上角或左下角開始尋找就是爲了當發現7小於最後一列第一行的數9時,就排除了第四列,依次查詢第3列,第2列的第一行。
解答思路及代碼
//思路從右上角開始,逐步排除右邊的列,鎖定列數後,逐步排除行
bool Find(int *matrix,int rows,int columns,int numbers)
{
bool found = false;
if( matrix != NULL && rows>0 && columns>0)
{
int col = columns -1;
int row = 0;
while( col>=0 && row<= (rows-1))
{
if(matrix[row * 4 + col]>numbers)//在第row行尋找可能所在的列數
{
col --;
}else{//在第col列尋找可能所在的行數
if(matrix[row * 4 + col] == numbers)//numbers等於第一行第col列時
{
found = true;
break;
}else{// numbers大於第一行第col列時 ,找這一列的其他行
row++;
}
}
}
}
return found;
}
4.測試
主函數:
int main()
{
int matrix[4][4]={
{1,2,8,9},
{2,4,9,12},
{4,7,10,13},
{6,8,11,15}
};
if(Find(*matrix,4,4,20)==true)
{
cout<<"Exist"<<endl;
return 0;
} else{
cout<<"Don't exist"<<endl;
return 0;
}
}
測試用例設計:
最小 | 中間 | 最大 | |
查詢存在的測試用例 | 1 | 7 | 15 |
測試結果: | Exist | Exist | Exist |
查詢不存在的測試用例 | 0 | 5 | 20 |
測試結果 | Don't exist | Don't exist | Don't exist |
二位數組的存儲二位數組matrix[row * columns + column]引用:https://zhidao.baidu.com/question/489919999594033652.html