杨氏矩阵-分治法查找

    在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。


/*
	一个m*n的矩阵,从左到右从上到下都是递增的,
	给一个数elem,求是否在矩阵中,给出思路和代码
*/

#include <stdio.h>

#define MAX_ROW 3
#define MAX_COL 3


static int matric[MAX_ROW][MAX_COL] = 
{
	{0,1,2},
	{5,7,10},
	{6,8,11},
};

struct pt {
	int row;
	int col;
};


struct pt binary_search(int low_row, int low_col, 
				   int high_row, int high_col, int elem)
{
	int mid_row, mid_col;
	int i;
	int low_key, high_key;
	struct pt pt1, pt2;

	if(low_row > high_row || low_col > high_col)
	{
		pt1.row = -1;
		pt1.col = -1;
		return pt1;
	}

	if(low_row == high_row)
	{
		for(i = low_col; i < high_col; i++)
		{
			if(matric[low_row][i] == elem)
			{
				pt1.row = low_row;
				pt1.col = i;
				return pt1;
			}
		}
		pt1.row = -1;
		pt1.col = -1;
		return pt1;
	}

	if(low_col == high_col)
	{
		for(i = low_row; i < high_row; i++)
		{
			if(matric[i][low_col] == elem)
			{
				pt1.row = i;
				pt1.col = low_col;
				return pt1;
			}
		}
		pt1.row = -1;
		pt1.col = -1;
		return pt1;
	}


	mid_row = low_row + (high_row - low_row) / 2;
	mid_col = low_col + (high_col - low_col) / 2;

	low_key = matric[mid_row][mid_col];
	high_key = matric[mid_row + 1][mid_col + 1];

	if(elem > low_key && elem < high_key)
	{
		pt1 = binary_search(mid_row + 1, low_col, 
				   high_row, mid_col, elem);
		
		pt2 = binary_search(low_row, mid_col + 1, 
				   mid_row, high_col, elem);
		if(pt1.row != -1)
			return pt1;
		if(pt2.row != -1)
			return pt2;		
		return pt1;
	}
	else if(!(elem == low_key || elem == high_key))
	{
		pt1 = binary_search(low_row, low_col, 
				   mid_row , mid_col, elem);
		
		pt2 = binary_search(mid_row + 1, mid_col + 1, 
				   high_row, high_col, elem);

		if(pt1.row != -1)
			return pt1;
		if(pt2.row != -1)
			return pt2;	
		return pt1;
	}

	if(elem == low_key){
		pt1.row = mid_row;
		pt1.col = mid_col;
	}
	else if(elem == high_key)
	{
		pt1.row = mid_row + 1;
		pt1.col = mid_col + 1;
	}
	return pt1;
}



int main(int c, char * v[])
{
	struct pt pt= binary_search(0, 0, 2, 2, 11);
	printf("(%d %d)\n", pt.row, pt.col);

	return 0;
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值