杨氏矩阵的查找

    在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。这道题是一道非常经典的题目,很多面试中都会遇到。但其实我们一拿到这个问题,可能都会想到那就直接找呗,我们把这样一个二维数组遍历一遍不是很快就找到了吗,但这并不是面试官所想看到的,下面我们来分析分析。

      首先我们随便拿一个满足条件的二维数组,假设我们要查找6是否在数组中,我们可以发现,如果第一行的最大数字都比6小,我们就直接在下一行查找,同样如果某一列的最小数都比6小,我们也就不用在比较这一列其他的数字了。

      首先选择第一行的最大数也就是最右边的5和6进行比较,发现是比6小的,那么我们就把第一行舍去转而比较第二行的最大数8,发现是大于6的,所以,这一列其他元素肯定都大于6了,应该把这一列也舍去,以此类推。

    

       

      下面是我的查找代码,对代码进行了很多地方的修正,如果查找到要找的数字直接返回它的下标,而且还有一个问题,就是它求出了这个二位数组所有元素按从小到大的顺序排列后,所要查找的数排在多少位。我在函数中取的二位数组比较简单{1, 2, 3, 4, 5, 6, 7, 8, 9 }

#include<stdio.h>
#include<windows.h>

#define ROW 3
#define COL 3

typedef struct Ret   //定义一个结构体类型,为了返回下标
{
	int row;
	int col;
}Ret;

Ret find_num(int arr[ROW][COL], int rows, int cols, int key)  //查找函数
{
	int row = 0;
	int col = cols - 1;
	Ret ret = { 0, 0 };

	while (row <= 2 && col >= 0)
	{
		if (arr[row][col] > key)  //如果比要找的数大,则列减一
		{
			col--;
		}
		else if (arr[row][col] < key)  //如果比要找的数小,则行加一
		{
			row++;
		}
		else
		{
			ret.row = row;
			ret.col = col;
			return ret;
		}
	}
	ret.row = -1;   //如果没有找到,返回(-1,-1)
	ret.col = -1;
	return ret;
}

int* change(int arr[ROW][COL],int length )     //二位数组转换成一位数组函数,length为二位数组的大小
{
	int i = 0;
	int *ma =(int *) malloc(length*sizeof(int));   //动态开辟了一个一位数组,也可以在函数外面初始化一个一位数组在这里调用
	int row = 0, col = 0;
	
	for (i = 0; i < length; i++)
	{
		ma[i] = arr[row][col];
		col++;
		if (col>COL - 1)
		{
			row++;
			col = 0;
		}
	}
	return ma;
}
int sort(int* arr,int length,int key )   //排序函数
{
	int x = 0,y = 0;
	for (x = 0; x < length;x++)
	{
		for (y = x + 1; y < length; y++)
		{
			if (arr[x]>arr[y])
			{
				int temp = arr[x];
				arr[x] = arr[y];
				arr[y] = temp;
			}
			if (arr[x] == key)
			{
				return x;
			}
		}
	}
	return -1;
}


int main()
{
	int arr[ROW][COL] = { 1, 2, 3, 2, 3, 4, 3, 4, 5 };
	int length = sizeof(arr) / sizeof arr[0][0];
	int key = 2;
	int* ma=NULL;
	int n = 0;
	Ret ret = find_num(arr,ROW, COL, key);
	printf("%d在第%d行第%d列\n",key,ret.row+1,ret.col+1);
	ma = change(arr, length);
	n = sort(ma, length, key);
	printf("%d按顺序排列在第%d位\n", key, n+1);

	system("pause");
	return 0;
}




















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值