C++ 二维数组中的二分查找

原创 2015年07月07日 10:40:02


在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
这样的矩阵有个性质,最左上角的元素必定是最小值,最右下角的是最大值,在一个m*n的矩阵中,类对角线:
i=(m1+m2)/2,j=(n1+n2)/2;
上的元素也是排好序的,通过对整体矩阵的一个行和列的二分查找,找到该矩阵类对角线上的中间点二维矩阵(左上角(m1,n1)比待查元素小,右下角(m2,n2)比待查元素大),然后递归查找这个中间矩阵相对的右上角的矩阵和左下角的矩阵即可。(因为左上角矩阵的元素都比(m1,n1)小,右下角的都比(m2,n2)大)


#include <iostream>
#include <stdio.h>

using namespace std;

int binSearch(int key,int **a,int n,int m1,int n1,int m2,int n2)
{
    int begin_m1=m1,begin_n1=n1,end_m2=m2,end_n2=n2;
    int i=(m1+m2)/2,j=(n1+n2)/2;
    int left=0,right=0;
    if(a==NULL)
        return 0;
    if(key<*(*(a+m1)+n1)||key>*(*(a+m2)+n2))
        return 0;
    else if(key==*(*(a+m1)+n1)||key==*(*(a+m2)+n2))
        return 1;
    while((i!=m1 || j!=n1) && (i!=m2 || j!=n2))
    {
        if(key==*(*(a+i)+j))
            return 1;
        else if(key<*(*(a+i)+j))
        {
            m2=i;
            n2=j;
            i=(m1+m2)/2;
            j=(n1+n2)/2;
        }
        else
        {
            m1=i;
            n1=j;
            i=(m1+m2)/2;
            j=(n1+n2)/2;
        }

    }

    if(i<end_m2)
        left=binSearch(key,a,n,i+1,begin_n1,end_m2,j);
    if(j<end_n2)
        right=binSearch(key,a,n,begin_m1,j+1,i,end_n2);
    if(left||right)
        return 1;

}


int main()
{
    int m,n;
    int key;
    while(cin>>m>>n)
    {
        cin>>key;
        int **a=new int *[m];
        for(int i=0;i<m;i++)
            a[i]=new int[n];
        int flag=0;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                scanf("%d",(*(a+i)+j));
        flag=binSearch(key,a,n,0,0,m-1,n-1);
        if(flag==1)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;

}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

已排序二维数组中的二分查找

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

二维数组的二分查找 解题报告

【题目大意】 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 【分析...
  • bin314
  • bin314
  • 2012-09-02 22:05
  • 2227

递归分治算法之二维数组二分查找(Java版本)

/** * 递归分治算法学习之二维二分查找 * @author Sking 问题描述: 存在一个二维数组T[m][n],每一行元素从左到右递增, 每一列元素从上到下递增,现在需要查找元素X(必在...

韩顺平 javascript教学视频_学习笔记11_js二维数组_js冒泡排序_二分查找

多维数组——二维数组 多维数组我们只介绍二维数组,一维数组的元素还可以是一个数组,就构成了二维数组。 下面看两个程序即可 var ar...

《剑指Offer》面试题3:二维数组中的查找(行列分别有序数组的二分查找)

题目:在一个二维数组中,每一行都按照从左dao'you

Java基础04天 学习笔记_数组进阶(数组排序,二分查找,进制转换,二维数组)

01 数组静态初始化   定义格式1 int[] arr= new int[5]; 定义格式2 , 赋值啦 int[] arr = new int[] {3,5,7,9}; //静态...

C++ 将二维数组显示成图像

  • 2012-03-16 09:44
  • 1.60MB
  • 下载

如何在C/C++中动态分配二维数组

如何在C/C++中动态分配二维数组 在C/C++中动态分配二维数组可以先申请一维的指针数组,然后该数组中的每个指针再申请数组,这样就相当于二维数组了,但是这种方法会导致每行可能不相邻,从而访问效率比...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)