对于杨氏矩阵老说,右上角和左下角的元素是有特点的。右上角的元素是一行中最大的,一列中最小的。左下角的元素是一行中最小的,是一列中最大的。所以我们可以从右上角或者左下角开始查找。比如:从右上角开始查找的时候,右上角的元素比我们要查找元素小,我们就可以去掉右上角元素所在的这一行;右上角的元素比我们要查找的元素大,我们就可以去掉右上角元素所在的这一列。然后依然找右上角的元素继续和要查找的元素与比较。这样每一次比较去掉一行或者去掉一列。这个查找效率是高于遍历数组元素的,而且时间复杂度是小于O(N)。
#include<stdio.h>
void find(int arr[][4], int x, int y, int input)
{
int i = 0;
int j = y - 1;//从右上角开始遍历
int flag = 0;
while (i < x && j >= 0)
{
if (input < arr[i][j])//比我小就向左
{
j--;
}
else
if (input > arr[i][j])//比我大就向下
{
i++;
}
else
{
printf("找到了,下标是arr[%d][%d]", i, j);
flag = 1;
break;
}
}
if (flag == 0)
{
printf("没有找到!");
}
}
int main()
{
int arr[3][4] = { {1,2,3,4} ,{5,6,7,8},{6,7,8,9} };
int input = 0;
printf("请输入查找的元素:");
scanf("%d", &input);
find(arr, 3, 4, input);
return 0;
}