- 二维数组的定义与初始化
- 存储形式
- 二维数组的二分查找
- 一维数组
二维数组与一维数组的定义和使用有许多共性。
1. 二维数组在使用前必须先定义和初始化,如果不定义直接使用将报错、定义了不初始化,使用时将会是随机数。
2.定义二维数组时,使用连续的两个[ ],[ ]内不能用变量表示元素个数(在引用时可以,如for内初始化数组),也不能用实数表示元素个数
{ }只能在数组定义的同时使用,由于二维数组在概念上可想象为”分行“的形式,因此也可以在初值的{ }中再嵌套一层{ },例如:
int a[2][3]={0, 1, 2, 3, 4, 5};
int a[2][3]={ {0, 1, 2}, {3, 4, 5}};
int a[][3]={ {0, 1, 2}, {3, 4, 5}};
计算机内存是连续和线性的。
这是一维数组a[5]在内存中的存储形式:
int a[5]={0, 1, 2, 3, 4};
| a[0] | a[1] | a[2] | a[3] | a[4] |
|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 |
这是二维数组b[3][4]在内存中的存储形式:
int b[3][4]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
是不是跟一维数组有异曲同工之妙,二维数组a[m][n]可以看成是m个一维数组a[n]的组合。通过这样的存储形式,我们可以求出二维数组的行数row、列数column:
int a[9][10]={};
int row=sizeof(a)/sizeof(a[0]);
int column=sizeof(a[0])/sizeof(a[0][0]);
二维数组能用二分查找,前提是:
二维数组,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序;或者每一行都按照从左到右递减的顺序排序,每一列都按照从上到下递减的顺序排序
虽然从左到右、从上到下都是递增状态,但是也分两种情况:
1.每行的第一个整数大于上一行的最后一个整数
2.每行的第一个整数与上一行的最后一个整数关系不知
第一种情况:可以把二维数组转换成一维数组,再从一维数组里进行二分查找,得到的结果是一维数组的mid,再转换成二维数组的行列就得到target再二维数组的下标了
#include#include int main() { int a[5][8]={}; int b[40]={}; int row=sizeof(a)/sizeof(a[0]); int column=sizeof(a[0])/sizeof(a[0][0]); int i, j, k=0; int target; for(i=0; i target) j=k-1; else break; } if(i>j) printf("没找到target"); else printf("traget %d的下标为a[%d][%d]", target, k/column, k%column); return 0; }
运行结果:
第二种情况:从i=0开始,对a[0][0]右边做行的二分查找,对a[0][0]下面做列的二分查找;a[1][1]、a[2][2]…同理操作,直到遍历完数组
#include#include int main() { int a[7][5]={}; int i, j, k; int low, high, mid; int target; for(i=0, k=0; i<7; i++) { for(j=i; j<5; j++) a[i][j]=k++; for(j=i+1; j<7; j++) a[j][i]=k++; } for(i=0; i<7; i++) { for(j=0; j<5; j++) printf("%-3d", a[i][j]); printf("n"); } printf("n"); k=5<7?5:7; target=34; for(i=0; i target) high=mid-1; else break; } if(a[i][mid]==target) { printf("找到了,下标是a[%d][%d]n", i, mid); break; } low=i, high=6; while(low<=high) { mid=(low+high)/2; if(a[mid][i] target) high=mid-1; else break; } if(a[mid][i]==target) { printf("找到%d了,下标是a[%d][%d]n", target, mid, i); break; } } if(low>high) printf("没找到"); return 0; }
运行结果:
如果看不懂文字解释,可以看这个视频:4_1_二维数组查找目标元素(二分查找)
一维数组
一维数组的的查找和排序方法可以看我的另一篇文章,包括1.顺序查找 2.二分查找; 1.(简单)选择排序法 2.冒泡排序法 3.(直接)插入排序法:
一维数组查询排序



