二维数组中的查找

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

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

如下:选择基准为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");
	else
		printf("没有\n");

	if(Find2(arr,4,4,1))
		printf("该数组中有\n");
	else
		printf("没有\n");

	if(Find2(arr,4,4,7))
		printf("该数组中有\n");
	else
		printf("没有\n");

	if(Find2(arr,4,4,20))
		printf("该数组中有\n");
	else
		printf("没有\n");

	if(Find2(arr,4,4,-2))
		printf("该数组中有\n");
	else
		printf("没有\n");

	if(Find2(arr,4,4,5))
		printf("该数组中有\n");
	else
		printf("没有\n");

	if(Find2(arr,4,4,NULL))
		printf("该数组中有\n");
	else
		printf("没有\n");
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值