二维数组的查找

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

算法思路:

1.拿数组中最右边的数和要找的数进行比较,如果右边数较大,可以不考虑最右边的一列,如果右边数较小,可以不考虑最上边的一行

2.因为二维数组可以看做是几个一维数组,并且这几个一维数组在内存中的存放都是连续的,所以参数可以设置为一个一维数组(int *或int [])

代码如下:

#include<iostream>
using namespace std;
bool find(int *data,int rows,int columns,int key)//int *data将二维数组转化为一维数组,指向二维数组第一个数的地址
{
    bool result=false;
    if(data!=NULL&&rows>0&&columns>0)//判断参数是否合法
    {
        int row=0,column=columns-1;//从最右边开始比较
        while(row<rows&&column>=0)
        {
            if(data[row*columns+column]==key)//找到
            {
                result=true;
                break;
            }
            else if(data[row*columns+column]>key)//要查找的值小于最右边的数,除去最右边的列
            {
                column--;
            }
            else//要查找的值大于最右边的数,除去最上边的一行
                row++;
        }
    }
    return result;
}
int main()
{
    int a[4][4]={1,2,8,9,2,4,8,12,4,7,10,13,6,8,11,15};
    //int (*p)[4]=a;
    cout<<find(*a,4,4,7)<<endl;//a[4][4]是一个二维数组,而a代表指向第一个分数组的指针,基类字节为4(int所占字节数)*4(分数组中元素的个数)=16个字节,因此不能赋值给int *(4个字节),而*a,a[0],&a[0][0]都代表二维数组第一个数的地址(4个字节)
    return 0;
}
原文地址:https://www.cnblogs.com/runninglzw/p/4470891.html