题目描述:
有一个二维数组(矩阵),每一行元素从左往右依次增大,每一列元素从上往下依次增大,
即表示为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;
}