二维数组中的查找

来源:互联网 发布:js修改css样式 编辑:程序博客网 时间:2024/06/07 01:30

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。现在我们要做一件事情:输入这样一个二维数组和一个整数,判断数组中是否含有该整数。

因为该数组从左到右递增、从上到下递增,所以我们可以在数组中选择一个基准与要找的数进行比较大小,如果基准与其相等,则找到;如果基准比其大,则在基准的上方或者左方查找;如果基准比其小,则在基准的下方或者右方进行查找。

如下:选择基准为4,找7;由于7>4我们确定下次找的范围为4的右方和下方,深紫色是重复的。


但是这样的查找给我们带来了不便,因为每次比较完之后,下次要查找的区域有重叠,而且没有规律。

所以我们换一种思路,开始选取右上角或者左下角的数作为基准进行比较,这样的话,借助数组中从左到右递增、从上到下递增,就可以一步一步进行剔除基准所在行或者列。

这里需要注意一下,不能选择左上方或者右下角的数做为基准,因为左上角的数比数组中任意位置的数小,无法做选择;右下角的数比数组中的任意位置的数都大,无法做选择。

1)、每次以右上角的数作为基准

2)、每次以左下角的数左为基准

代码:

#include<stdio.h>bool Find2(int *matrix,int rows,int columns,int number)//选取左下边的数字进行比较{bool found=false;if(matrix!=NULL && rows>0 && columns>0){int row=rows-1;int column=0;while(row>=0 && column<columns){if(matrix[row * columns+column]==number){found=true;break;}else if(matrix[row*columns+column]>number){--row;}else{++column;}}}return found;}bool Find1(int *matrix,int rows,int columns,int number)//选取右上角的数字进行比较{bool found=false;if(matrix!=NULL && rows>0 && columns>0){int row=0;int column=columns-1;while(row<rows && column>=0){if(matrix[row * columns+column]==number){found=true;break;}else if(matrix[row*columns+column]>number){--column;}else{++row;}}}return found;}int main(){int arr[]={1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15}; if(Find2(arr,4,4,15))printf("该数组中有\n");elseprintf("没有\n");if(Find2(arr,4,4,1))printf("该数组中有\n");elseprintf("没有\n");if(Find2(arr,4,4,7))printf("该数组中有\n");elseprintf("没有\n");if(Find2(arr,4,4,20))printf("该数组中有\n");elseprintf("没有\n");if(Find2(arr,4,4,-2))printf("该数组中有\n");elseprintf("没有\n");if(Find2(arr,4,4,5))printf("该数组中有\n");elseprintf("没有\n");if(Find2(arr,4,4,NULL))printf("该数组中有\n");elseprintf("没有\n");return 0;}