杨氏矩阵的查找
2016-04-23 15:52
309 查看
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。这道题是一道非常经典的题目,很多面试中都会遇到。但其实我们一拿到这个问题,可能都会想到那就直接找呗,我们把这样一个二维数组遍历一遍不是很快就找到了吗,但这并不是面试官所想看到的,下面我们来分析分析。
首先我们随便拿一个满足条件的二维数组,假设我们要查找6是否在数组中,我们可以发现,如果第一行的最大数字都比6小,我们就直接在下一行查找,同样如果某一列的最小数都比6小,我们也就不用在比较这一列其他的数字了。
首先选择第一行的最大数也就是最右边的5和6进行比较,发现是比6小的,那么我们就把第一行舍去转而比较第二行的最大数8,发现是大于6的,所以,这一列其他元素肯定都大于6了,应该把这一列也舍去,以此类推。
下面是我的查找代码,对代码进行了很多地方的修正,如果查找到要找的数字直接返回它的下标,而且还有一个问题,就是它求出了这个二位数组所有元素按从小到大的顺序排列后,所要查找的数排在多少位。我在函数中取的二位数组比较简单{1, 2, 3, 4, 5, 6, 7, 8, 9 }
首先我们随便拿一个满足条件的二维数组,假设我们要查找6是否在数组中,我们可以发现,如果第一行的最大数字都比6小,我们就直接在下一行查找,同样如果某一列的最小数都比6小,我们也就不用在比较这一列其他的数字了。
首先选择第一行的最大数也就是最右边的5和6进行比较,发现是比6小的,那么我们就把第一行舍去转而比较第二行的最大数8,发现是大于6的,所以,这一列其他元素肯定都大于6了,应该把这一列也舍去,以此类推。
下面是我的查找代码,对代码进行了很多地方的修正,如果查找到要找的数字直接返回它的下标,而且还有一个问题,就是它求出了这个二位数组所有元素按从小到大的顺序排列后,所要查找的数排在多少位。我在函数中取的二位数组比较简单{1, 2, 3, 4, 5, 6, 7, 8, 9 }
#include<stdio.h> #include<windows.h> #define ROW 3 #define COL 3 typedef struct Ret //定义一个结构体类型,为了返回下标 { int row; int col; }Ret; Ret find_num(int arr[ROW][COL], int rows, int cols, int key) //查找函数 { int row = 0; int col = cols - 1; Ret ret = { 0, 0 }; while (row <= 2 && col >= 0) { if (arr[row][col] > key) //如果比要找的数大,则列减一 { col--; } else if (arr[row][col] < key) //如果比要找的数小,则行加一 { row++; } else { ret.row = row; ret.col = col; return ret; } } ret.row = -1; //如果没有找到,返回(-1,-1) ret.col = -1; return ret; } int* change(int arr[ROW][COL],int length ) //二位数组转换成一位数组函数,length为二位数组的大小 { int i = 0; int *ma =(int *) malloc(length*sizeof(int)); //动态开辟了一个一位数组,也可以在函数外面初始化一个一位数组在这里调用 int row = 0, col = 0; for (i = 0; i < length; i++) { ma[i] = arr[row][col]; col++; if (col>COL - 1) { row++; col = 0; } } return ma; } int sort(int* arr,int length,int key ) //排序函数 { int x = 0,y = 0; for (x = 0; x < length;x++) { for (y = x + 1; y < length; y++) { if (arr[x]>arr[y]) { int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } if (arr[x] == key) { return x; } } } return -1; } int main() { int arr[ROW][COL] = { 1, 2, 3, 2, 3, 4, 3, 4, 5 }; int length = sizeof(arr) / sizeof arr[0][0]; int key = 2; int* ma=NULL; int n = 0; Ret ret = find_num(arr,ROW, COL, key); printf("%d在第%d行第%d列\n",key,ret.row+1,ret.col+1); ma = change(arr, length); n = sort(ma, length, key); printf("%d按顺序排列在第%d位\n", key, n+1); system("pause"); return 0; }
相关文章推荐
- 关于UIScrollView设置约束时需要注意的几点
- ARM汇编之寻址方式
- Masonry适配——(3)UILable如何设置多行显示
- 寄存器、缓存、内存、硬盘、存储器的理解
- Spring AOP初试
- XMPP学习——2、用户登录
- UVA - 10361 Automatic Poetry
- Mac电脑截图快捷键
- 题目1516:调整数组顺序使奇数位于偶数前面-归并排序
- Django - 用户注册
- Socket实现聊天室
- Supervised learning、Unsupervised learning and Semi-Supervised learning (总结)
- 史上最全设计模式导学目录(完整版)
- HashMap源码剖析
- HDU 1202 The calculation of GPA(数学)
- 第九周项目3:我的数组类
- Android Sdudio 模板文件的新建。
- js中函数表达式、函数声明和立即执行函数归纳
- 欢迎使用CSDN-markdown编辑器
- jQuery用contents方法取非DOM节点中的文本内容