1.概念:
矩阵的每行从左到右是递增的,矩阵从上到下是递增的
eg:4*4的数组(该阵就为杨氏矩阵)
2.相关代码题:
eg:假如有一个4(i)*4(j)数组(如上图),请编写程序在杨氏矩阵中查找某个数字是否存在。如若存在,则打印出坐标,否则打印没有找到。
(1)分析:
假如查找14(key)是否存在(i:行,j:列)
我们可以从该二维数组的第一行的最后一个元素,开始来与所查找的数进行对比,比key(14)大就向下移-->i++,否则向左移-->j--。如果遍历完整个数组都没有找到的话(所查找的元素在数组范围外),就没有找到(如若从数组的第一个元素开始遍历比较这样会比较费时,向刚才的那样写下来的时间复杂度为m(行) + n(列))
(2)代码实现:
#include <stdio.h>
#include <stdlib.h>
int* Yangsearch(int arr[4][4], int key)
{
int* ret = (int*)calloc(2, sizeof(int));
if (ret == NULL)
{
perror("calloc");
}
int i = 0;
int j = 0;
while (arr[i][3 + j] != key)
{
if (arr[i][3 + j] < key)
{
i++;
}
else
{
j--;
}
if (i < 0 || j > 4 - 2 || i > 4 + 1 || 3 + j < 0) //查找元素在数组以外,就是没找到
{
return NULL;
}
}
ret[0] = i;
ret[1] = 3 + j;
return ret;
}
int main()
{
int arr[4][4] = { {1,5,7,9},{4,6,10,15},{8,11,12,19},{14,16,18,21} };
int key = 0;
scanf("%d", &key);
int i = 0;
int* p = Yangsearch(arr, key);
if (p == NULL)
{
printf("没有找到!");
}
else
{
printf("找到了!位置为:\n");
for (i = 0; i < 2; i++)
{
printf("%d ", *(p + i));
}
}
return 0;
}
(3)实际运行结果:
输入14,找到了并且返回它的位置。
输入17,没有找到!