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;

}


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

二维有序矩阵(杨氏矩阵)的二分查找

php实现:
  • wusuopuBUPT
  • wusuopuBUPT
  • 2013年10月09日 18:27
  • 1373

【剑指offer】二分查找二维数组

剑指offer上的第一道题目,在九度OJ上测试通过 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整...
  • mmc_maodun
  • mmc_maodun
  • 2014年05月04日 14:23
  • 4376

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

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

二分查找及其扩展循环查找及二维查找

1.一般二分查找     N个数字已经从大到小排列,给定一个数P,P是否存在于这N个数中?在怎样的策略下,使得最坏的情况下,需要比较的次数最少?为什么?     顺序查找,平均需要比较(N+1)/2次...
  • outstandinger
  • outstandinger
  • 2013年09月17日 17:22
  • 959

【剑指offer】二分查找二维数组

问题描述      在一个二维整数数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。     ...
  • u014755255
  • u014755255
  • 2016年03月30日 13:50
  • 708

二维数组内的二分查找<转载>

【题目】 已知一个二维整数数组(或者说,一个整数矩阵),每行从左到右递增,每列从上往下递增。要求定义一个函数,输入矩阵和某个整数k,判断k是否在这个矩阵内。 【思路】 像四叉树那样递归查找,...
  • xiaolang85
  • xiaolang85
  • 2013年08月30日 18:15
  • 1311

二分(二分答案、二分搜索)与单调性

经典二分搜索是二分空间范围。 二分答案又叫二分猜值,是二分解的值空间。 其实可以统一,普通的二分搜索也是二分答案值域——下标空间,也是猜值。 二分必须满足单调性,最直观的,二分搜索只能在有序数组上...
  • binling
  • binling
  • 2015年08月04日 23:46
  • 454

二维数组中二分查找

二维数组中二分查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 解题思路...
  • u010865433
  • u010865433
  • 2015年10月29日 20:26
  • 417

分治法-----二分查找

1.问题描述
  • xingchenleidandan
  • xingchenleidandan
  • 2014年12月02日 07:58
  • 1076

分治算法--二分搜索

二分查找:以有序表表示静态查找表时,查找函数可以用二分查找(binary search or half-intervalsearch )来实现。这种算法基于分治。...
  • ling_xiao007
  • ling_xiao007
  • 2015年08月03日 14:24
  • 1024
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 二维数组中的二分查找
举报原因:
原因补充:

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