二维数组中的查找

来源:互联网 发布:语音读短信软件 编辑:程序博客网 时间:2024/06/16 09:49

       查找,这个次对于初学的程序员来说,就是很常见的字眼。那么简单的说就,在一堆数中寻找你要找的那个数,很简单就是挨个排查。那么c最讲究的局势效率,那么效率多少呢。

       先简单的说一说以为数组,为了提高效率,引出了二分查找,忘了的话,去这里面在复习一下一维的二分查找。http://blog.csdn.net/qq_35256722/article/details/51655177。那么二维数组有么有这么类似的二分查找。来提高二位数组的效率呢?

     今天来介绍一个在二维数组中的“二分查找”。

由题引入吧。

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

        例如:下面的二位数组都是每行梅列递增,如果在这个数组中查找数字7,如果有就返回true,如果没有就返回fasle。

     1  2  8   9

     2  4  9   10

     4  7  10  13

     6  8  11   15


思路:1.选取数组的右上角的数字比交,9比7大,那么9这一列中9最小都没有比7小那么,在这一列中没有比7小的了。那么这一行可以不考虑了,剔除掉9所在这一列(图a)。看剩下的,最右上角,那么就是不8,同理剔除8所在的这一列(图b),剩下的就是这个右上角是2,明显比7小,那么在剔除完,其余的后,发现,第一列中2最大,最大的数没有7大,那么这一行也可以剔除(图c)第二行,此时,数组中只剩下了四个数字,依旧是最右上角的数字,刚好是7,就一比较结束(图d)。


总结一下,那就是每次拿右上角的数字和num比较,大于剔除列,小于剔除行。

实现这么一个函数就ok。bool  find(int *array,int row,int colu,int num).

row是行,colu是列。num是要查找的数。

      比较权威的书上是这么写的,

bool Find_t(int *array,int row,int colu,int num){bool found = false;if(array != NULL && row > 0 && colu > 0){int i = 0;int j = colu - 1;while(i < row && colu >= 0){if(array[i * colu + j] == num){found = true;break;}else if(array[ i*colu + j] > num)--j;else++ i;}}     return found;}int main(){int array[] = {1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};                 int i = Find_t(array,4,4,3);printf("%d\n",i);return 0;}

我自己是这么写的:

#include<stdio.h>bool Find(int array[4][4],int row,int colu,int num){int i = 0;int j = colu -1;if(array == NULL || row < 0||colu < 0){return false;}while(i < row && j >= 0){     if(array[i][j] > num)   j--; else if(array[i][j] < num)++i; else return true;}return false;}int main(){int array[4][4] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};        int i = Find(array,4,4,3);printf("%d\n",i);return 0;}

也许,我写的更简单,易懂。

ok,是不是这个方法就比你挨个查找要简单的多,复杂程度低的多吧!

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘金币过期怎么办2018 换详情排名下降怎么办 长城宽带不用了怎么办 快递到了想退货怎么办 淘宝退货商家拒收怎么办 淘宝运费险失败怎么办 忘记购买运费险怎么办 咸鱼买家申请退款怎么办 熟猪肉有点变味怎么办 和领导意见不一致怎么办 骑手提前点送达怎么办 ubuntu安装报错怎么办 液相色谱两峰分不开怎么办 液相色谱柱老堵怎么办? 没有装usb驱动怎么办 ipad速度越来越慢怎么办 美萍管理软件打不开怎么办 小米4开机黑屏怎么办 小米电脑死机了怎么办 小米8手机死机怎么办 oppa7开不了机怎么办 oppo手机wlan打不开怎么办 三星s6进水黑屏怎么办 银行卡不支持快捷支付怎么办 路由器忘记管理员密码怎么办 云付没有推荐人怎么办 牛呗审核不通过怎么办 华硕笔记本很卡怎么办 淘宝换货没有货怎么办 用手机怎么办网银 手机销号支付宝怎么办 黑狗狗毛发红怎么办 裤子洗掉色了怎么办 没买快递收到怎么办 淘宝介入卖家不举证怎么办 买家拒收快递货怎么办 买家到付拒收怎么办 买家发顺丰到付又拒收怎么办 到付快递骗局怎么办 一年级学生上课走神怎么办 网购出现质量问题怎么办