二维有序数组快速查找:
这里的二维有序数组是每行有序,每列有序,不一定行与行有序,但是整体从左到右或从上到下只能同时是升序或降序。
思路:首先看升序,从右上角向下找。
以你们的聪明才智降序应该都知道怎么写了。
如果被找数比最右边的数大那就向下移动一行,直到小于为止,再在这一行用二分查找法(如果不知道看我的上一个博客哦)找到这个数。
总体思路是这样,你们可以从右下角出发,向上寻找。
代码如下:
#include<stdio.h>
int main(void)
{
int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
int k = 0;
scanf("%d", &k);
int i = 0;
int j = 2;
int left = 0;
int right = j;
int mid = (left + right) / 2;
while (i <= 2)//从右上角向右下角移动
{
if (arr[i][j] < k)
{
i++;
}
else if (arr[i][j] > k)
{
while (left <= right)//这一行上 二分查找法
{
mid = (left + right) / 2;
if (arr[i][mid] < k)
{
left = mid + 1;
}
else if (arr[i][mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,坐标是(%d,%d)\n", i + 1, mid + 1);
break;
}
}
break;
}
else
{
printf("找到了,坐标是:>(%d,%d)\n", i + 1, j + 1);
break;
}
}
if (i > 2 || left > right)//找不到的情况
{
printf("没找到\n");
}
return 0;
}
如有错误可直接指出,希望能与小伙伴们共同成长。
觉得不错可以点赞鼓励一下博主,评论更好的😏。