杨氏数组(矩阵)查找

7 篇文章 0 订阅

题目描述:
有一个二维数组(矩阵),每一行元素从左往右依次增大,每一列元素从上往下依次增大,
即表示为Table[i][j]<Table[i][j+1] && Table[i][j]<Table[i+1][j], 则这样的矩阵我们称之为杨氏矩阵。求一元素是否存在于杨氏矩阵中。
在这里插入图片描述
如图所示,想要在上图所示的矩阵中查询一个数是否存在,最简单,或者直观的做法当然是双重for循环遍历数组中的每一个元素,直到找到为止。但是,这样的方法足够暴力,但是,难免,失了巧劲儿,导致这样做的效率不高,在一个很大的数组中,若是这样的话,很浪费时间。那么,为此,我们将探讨以下的方法:

Step-Wise线性搜索法

由于矩阵按行序和列序分别都是增加的,那么,我们只需要每次和当前行或者列中最大的元素进行比较即可,若是要搜索的数大于当前行列中最大的元素,那么,直接跳到下一行列在此循环比较,逐步缩小查找范围,直到找到该元素为止,下面就以在该矩阵中查找8为例进行说明:
在这里插入图片描述
代码如下:

#include<stdio.h>
#include<Windows.h>

void YoungMatrix(int arr[][5], int *px, int *py, int key)
{
	int x = 0;
	int y = *py - 1;
	while (x < *px&&y >= 0){
		if (arr[x][y] == key){
			*px = x;
			*py = y;
			return;
		}
		else if (arr[x][y] < key){
			x++;
		}
		else{
			y--;
		}
	}
	*px = -1; //函数若没有在前面跳出,则此处将x,y都置为-1,表示没有查询到
	*py = -1;
}

int main()
{
	int x = 5;
	int y = 5;
	int arr[5][5] = { { 1, 2, 3, 4, 5 }, 
					{ 2, 5, 6, 7, 9 },
					{ 4, 6, 9, 10, 14 }, 
					{ 6, 7, 10, 11, 15 }, 
					{ 8, 10, 12, 15, 16 } };

	YoungMatrix(arr, &x, &y, 8);

	if (x >= 0 && y >= 0 && x < 5 && y < 5){
		printf("Find it!\nThe location is <%d,%d>\n", x, y);
	}
	else{
		printf("No found!\n");
	}

	system("pause");
	return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值