简单来说,就是一个矩阵,其特点是从左到右以及从上到下数据总是递增的。如图所示
查找元素是否在其中既然我们知道了杨氏矩阵的特点,那么我们可以发现,右上角的元素往左是递减的,往下是递增的。左下角的元素往上是递减的,而往上是递减的。
那么我们以有上角元素为例: 如图所示也就是说如果是右上角的元素,它左边的元素一定比它小,而它下边的元素一定比它大。
而左下角的元素,它上面的元素一定比它小,它右边得元素一定比它多。
假如我们将这个元素作为标杆,那么如果要查找的元素比它小,那么一定在它的左边;如果比它大,那么一定在它下面。因为不论这两边那边查到终点,要不是这个矩阵中最小的数,要不就是这个矩阵中最大的数,所以如果查到底了,还是找不到,说明这个数不在这个矩阵中。
而且需要注意的是,如果要查找的数比标杆数小,那么如果这个数在,那么一定在标杆数的左边,即只需要查找标杆数左边的的元素即可;如查找的数大,同样的道理。
好的,代码如下,这里我们将杨氏矩阵直接给了出来,方便理解。
#includeint yang_table(int (*arr)[6],int x,int y,int a) { int i = 0; int flag = 0; while (i < x && y >= 0) { if (arr[i][y - 1] == a) { flag = 1; break; } else { if (arr[i][y - 1] > a) y--; else i++; } } return flag; } int main() { int arr[5][6] = { {1,2,3,4,5,6} ,{2,3,4,5,6,7} ,{3,4,5,6,7,8},{4,5,6,7,8,9},{5,6,7,8,9,10}}; printf("请输入要查询的数:"); int a = 0; scanf("%d", &a); int re=yang_table(arr,5,6,a); if (1 == re) printf("Findn"); else printf("Not Findn"); return 0; }
首先对于这段代码,可能需要注意的首先是,flag的作用。
flag,在这里作为一个标杆,在查找开始之前,将其设置为0,当需要查找的数找到之后,将其设置为1,此时flag发生了变化,然后用break语句跳出循环,然后将flag的值返回给主函数,如果发现flag的值发生了变化,说明找到了,反之则没有。
其次就是当标杆数不是要查找的数时,需要向左查还是向下查,这里需要注意如果写反了,是肯定查不出来的,就算要查找的数在这个矩阵中。
左下角的数也可以实现,道理是一模一样的,所以这里我们不过多赘述。
好了,本文到这儿就结束了,如有错误还请指针,如果觉得不错的话,up主求个三连哦!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)