题目:
在一个二维数组中,每一行都按照从左到右,递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输出这样的一个二维数组和一个整数,判断数组中是否包含该整数。
测试用例:
提前写出测试用例这是一个不错的习惯,因为测试用例可以引导我们程序的编写与判断。
1.二位数组中包含查找的数字(最大值、最小值和中间值);
2.二维数组中不包含查找的数字(超过最大值、小于最小值和在最大值与最小值之间,但不包含于二维数组);
3.特殊输入测试(空指针)。
测试矩阵:
思路:
首先我们我们选取数组右上角的数字9.由于9大于7,并且9还是第4列的第一个(也是最小的),因此7不可能出现在数字9所在的列。于是我们把这一列从需要考虑的区域去除掉,之后只需要分析剩下的3列。在剩下的矩阵中,位于右上角的数字是8.同样大于7,因此8所在的列我们也可以去除。接下来继续分析。
在剩余的俩列中,位于右上角的数字2小于7,那么要查找的7可能在2的右边,也可能在2的下边。在前面的过程中,已经将2右边的列都给去除掉了,也就是说7不可能出现在2的右边,因此7只能出现在2的下边,于是把2所在的行去除。在剩下的数字中,数字4位于右上角,同2.最后剩下俩行俩列数字。
在剩下的俩行俩列数字中,位于右上角的刚好是7,于是查找的过程就结束了。
程序代码:
#include<stdio.h>
//查找函数
//约定:查找成功返回1;查找失败返回0
int Find(int* matrix,int rows,int cols,int num){
if(matrix!=NULL&&rows>0&&cols>0){
int row = 0;
int col = cols -1;
while(col>=0 && row<rows){
if(matrix[row*cols+col] <num){
--col;
}else if(matrix[row*cols+col] > num){
++row;
}else{
return 1;
}
}
}
return 0;
}
检测用例代码:
//主函数
int main(){
int matrix[4][4] = {
{1,2,8,9},
{2,4,9,12},
{4,7,10,13},
{6,8,11,15}
};
printf("\n***********查询成功*************************\n");
int ret = Find(&matrix[0][0],4,4,15);//最大值
printf("ret except:1 actual:%d\n",ret);
ret = Find(&matrix[0][0],4,4,1);//最小值
printf("ret except:1 actual:%d\n",ret);
ret = Find(&matrix[0][0],4,4,7);//介于最大值与最小值之间,存在
printf("ret except:1 actual:%d\n",ret);
printf("\n***********查询失败*************************\n");
ret = Find(&matrix[0][0],4,4,16);//大于最大值
printf("ret except:0 actual:%d\n",ret);
ret = Find(&matrix[0][0],4,4,0);//小于最小值
printf("ret except:0 actual:%d\n",ret);
ret = Find(&matrix[0][0],4,4,5);//介于最大值与最小值之间,不存在
printf("ret except:0 actual:%d\n",ret);
return 0;
}
结果显示: