在有序二维数组快速查找元素
问题描述:
给定int型二维数组array,array[i][j+1]>=array[i][j]和array[i+1][j]>=array[i][j]恒成立(对于任意合法的下标i,j)。输入一个int型数字target,若target在array中返回ture,否则返回false。
解题思路:
关键代码:
/*************************************************/
/* 作者:codeology
/* 时间:2018-03-18
/* 说明:在有序二维数组寻找目标数
/* 变量:i,j,k,l ---> 索引下标
/* flag ---> 标记变量
/* target ---> 目标数
/* array ---> 二维数组
/*************************************************/
#include<stdio.h>
#define row 8
#define column 9
int find(int i, int j, int k, int l, int flag, int target, int array[row][column])
{
if((target < array[i][j]) || (target > array[k][l])) return 0;
int temp1, temp2;
switch(flag)
{
//自上向下搜索
case 1:
{
temp1 = i; temp2 = j;
while((i < k) && (array[i][j] < target)) i++; //按列搜索第一个不小于target元素
if(array[i][j] == target) return 1;
while((j < l) && (array[temp1][j] < target)) j++;//按行搜索第一个不小于target元素
if(array[temp1][j] == target) return 1;
if(i == k) i++; //如果这一列元素都小于target,此时不能轻易剔除i指向元素所在行
if(j == l) j++; //如果这一行元素都小于target,此时不能轻易剔除j指向元素所在列
find(temp1, temp2, i-1, j-1, -flag, target, array);
}
break;
//自下向上搜索
case -1:
{
temp1 = k; temp2 = l;
while((k > i) && (array[k][l] > target)) k--;
if(array[k][l] == target) return 1;
while((l > j) && (array[temp1][l] > target)) l--;
if(array[temp1][l] == target) return 1;
if(i == k) k--;
if(j == l) l--;
find(k+1, l+1, temp1, temp2, -flag, target, array);
}
break;
default:;
}
}
int main()
{
int array[row][column] = {
{1, 2, 3, 4, 5, 6, 7, 8, 9},
{10, 11, 12, 13, 14, 15, 16, 17, 18},
{19, 20, 21, 22, 23, 24, 25, 26, 27},
{28, 29, 30, 31, 32, 33, 34, 35, 36},
{37, 38, 39, 40, 41, 42, 43, 44, 45},
{46, 47, 48, 49, 50, 51, 52, 53, 54},
{55, 56, 57, 58, 59, 60, 61, 62, 63},
{64, 65, 66, 67, 68, 69, 70, 71, 72}
};
int target;
int flag = 1;
//scanf("%d", &target);
//对所有元素测试一遍
for(target = -7; target <= 80; target++)
{
if(find(0, 0, row - 1, column - 1, flag, target, array))
printf("%2d is ture |", target);
else
printf("%2d is false |", target);
if(target % 8 == 0 )
printf("\n");
}
return 0;
}
测试结果: