数组简介
数组是相同数据类型的元素的集合。
数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。
数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。
数组的特性:查询快、增删慢。
为什么查询快?
因为数组存在下标这个概念,可以通过下标对元素进行直接访问,而并不需要像链表一样一步步遍历。
为什么增删慢?
这里举个例子,例如:
arr[10] 这个一维数组中,元素存放已满,现要将arr[5] 这个元素删除掉,那是否就要将 arr[6] - arr[10] 这五个元素全部向前移动来补齐空位呢,所以就总结出来了,数组的元素删除需要移动大量元素;同理插入元素也是一样的道理,所以增删慢。
一维数组的基本操作
数组可以进行插入、删除、查找、遍历、排序等等操作…
一维数组的输入
如下图所示,创建一个 有10个元素的数组arr,又因为它的下标是从0开始,所以最后一位元素位置的下标为9。
void cerate(){
//定义一个 int类型数组
int arr[10];
//实现循环录入数组数据
//这里需要注意 数组的下标以0开始,所以10个元素的数组下标最多到9
for( int i=0; i<10; i++){
printf("请输入第%d个元素:",i+1);
scanf("%d",&arr[i]);
}
}
一维数组的输出
// length 为接收的数组长度
int print(int arr[],int length){
for(int i=0; i<length; i++){
printf("%d ",arr[i]);
}
}
一维数组的查找
一维数组查找数据是否存在,可以通过遍历数组一步步进行比较,如下文代码所示:
// length 为接收的数组长度
void find(int arr[],int length){
int value;
printf("请输入待查找值:");
scanf("%d",&value);
//遍历数组
for(int i=0; i<length; i++){
//这里进行判断比较
if(arr[i] == value){
printf("%d存在数组中,其下标为:%d",value, i);
}
}
}
一维数组的插入
即元素插入,插入数据需要将插入元素位置及以后的元素向后移动,为待插入数据腾出空间。
// length 为接收的数组长度
void insert(int arr[], int length){
int index;
printf("请输入待插入元素的下标:");
scanf("%d",&index);
int value;
printf("请输入待插入元素的值:");
scanf("%d",&value);
//将待插入元素位置及以后的元素后移,为其腾空位置
for(int i=length-1; i>=index ;i++){
arr[i+1] = arr[i]; //将当前位置元素放到后一位中
}
//元素插入 增加数组元素,所以长度相对应也要增加
length++;
}
一维数组的删除
删除元素与插入相反,需要删除元素以后的元素向前移动,补齐空位。
可以通过删除 指定元素 或 删除指定下标位置 来操作。
// length 为接收的数组长度
void insert(int arr[], int length){
//通过删除指定下标位置
int index;
printf("请输入待删除元素的下标:");
scanf("%d",&index);
//通过删除指定元素值
int value;
printf("请输入待删除元素的值:");
scanf("%d",&value);
//这里就以删除指定下标位置为例,将删除位置以后的元素向前移动,补齐空位。
//将index+1位的元素 覆盖到 index的位置,index+2 覆盖 index+1 以此类推…
for(int i=index+1; i<length ;i++){
arr[i-1] = arr[i]; //将当前位置元素放到前一位中
}
//元素删除 减少数组元素,所以长度相对应也要减少
length--;
}
一维数组的修改
元素修改,与删除一样,我们也是可以通过修改指定下标位置的值,或修改指定值来操作。
上面元素删除拿下标举例子,那元素修改就拿指定值来举例吧。
// length 为接收的数组长度
void amend(int arr[], int length){
//这里输入待修改的值,即修改前的值
int value;
printf("请输入待修改数据的下标:");
scanf("%d",&value);
//这里输入修改后的值
int value_02;
printf("请输入修改后的值:");
scanf("%d",&value_02);
for(int i=0; i<length; i++){
if(arr[i] == value){
//因为已经满足判断条件 arr[i] == value ,所以以下两行代码等价,选择其一即可
value = value_02;
arr[i] = value_02;
}
}
}
一维数组的排序
这里因为涉及到了排序算法,大家简单了解即可,以后我会针对排序算法专门出一篇文章进行讲解。
这里采用 冒泡排序 对数组arr进行排序,这里针对下文代码为大家简单讲解冒泡排序的思想。
冒泡排序的思想:相邻两数两两进行比较,将 较大 值移动至后方。
// length 为接收数组的长度
void bubbleSort(int arr[], int length){
//这里 i<length-1 是为了能够减少循环次数,因为提取1个数据与其余剩下9个数据做对比,如果还比较10次话 会浪费时间,无形中增加了时间复杂度。
for(int i=0;i< length-1; i++){
//这里 j<length-i-1 用来控制比较值的个数,即比较次数
for(int j=0; j<length-i-1 ;j++){
//判断前值是否大于后值,若大于则进行交换
if(arr[j] > arr[j+1]){
//空杯交换,即:创建一个新的变量接收arr[j]的值。否则直接将arr[j+1]的值直接赋给arr[j]后,那么arr[j]的值被覆盖则无法将原值重新赋给arr[j+1]
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = arr[j];
}
}
}
}
二维数组的基本操作
二维数组的初始化
这里 为了能够让大家清晰明了的了解二位数组的存储模式,先以初始化的方式来为其赋值。
void create(){
int arr[3][2] = { // 意为 3行2列
{1,2},
{3,4},
{5,6}
};
}
二维数组的输入
void create(){
int arr[3][2];
//定义行下标 循环行
for(int i=0; i<3; i++){
//定义列下标 循环列
for(int j=0; j<2; j++){
printf("请输入第%d行第%d列的元素:",i+1, j+1);
scanf("%d",&arr[i][j]);
} //执行完毕内层循环后 表明已经输入完当前列的数据,紧接着外层的第二次循环开始对第二行元素的输入
}
}
二维数组的输出
// length 为接收的数组行 length_02 为接收的数组列
int print(int arr[],int length, int length_02){
for(int i=0; i<length; i++){
for(int j=0; j<length_02; j++){
printf("%d ",arr[i][j]);
}
//这里需要注意,如果执行完毕内层循环 则表明已经输出完当前行所有列的值,则需要换行
printf("\n");
}
}
二维数组的查找
二维数组与一维数组相似,一样可以通过遍历判断来查找。
// length 为接收的数组行 length_02 为接收的数组列
void find(int arr[],int length){
int value;
printf("请输入待查找值:");
scanf("%d",&value);
//遍历数组
for(int i=0; i<length; i++){
for(int j=0; j<length_02 ;j++){
//这里进行判断比较
if(arr[i] == value){
printf("%d存在数组中,它在第%d行第%d列",value, i+1, j+1);
}
}
}
}