二维数组中的查找
来源:互联网 发布:语音读短信软件 编辑:程序博客网 时间: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,是不是这个方法就比你挨个查找要简单的多,复杂程度低的多吧!
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- 二维数组中的查找
- Java对象的序列化和反序列化
- 曾经映射到AIX主机的存储LUN在存储断开(光纤线拔掉)的情况下的ls -rlt /dev/和lspv的结果差异
- HDU 2516 取石子游戏 斐波那契博弈裸题
- 获取iPhone手机的型号 iOS
- Android 文件及文件夹删除
- 二维数组中的查找
- EditText 多行显示及所有属性
- 可以用来膜拜:一个草根程序员如何进入BAT
- angular2.0路由与导航二
- Ubuntu系统提示Sorry, command-not-found has crashed 解决方法
- CentOS7增加或修改SSH端口号
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
- JSP
- Java android 反射