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