您的位置:首页 > 其它

在有序二维数组快速查找元素

2018-03-18 19:03 190 查看

在有序二维数组快速查找元素

问题描述:
    给定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;    

测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: