在一个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;
}