目录
数组作为一种数据结构,有常用的 5 种操作:查找,插入,删除、检索和遍历。
1、数组元素的查找
当我们知道元素的值时,需要找到该元素在数组中的位置。我们可以对未排序的数组使用顺序查找算法,对排序的数组使用折半查找算法。
2、数组元素的插入
通常,计算机语言要求数组的大小( 数组中元素的个数) 在程序被写的时候就被定义,防止在程序的执行过程中被修改。但是,有些语言允许可变长数组。即使语言允许可变长数组,但是在数组中插入一个元素仍需要十分小心,防止数据的丢失。
数组元素的插入有三个位置,分别是开始、中间和尾部。尾部插入是最容易的,没有数据的移位;开始和中间的插入过程是冗长且花费时间的。例如,在 9 个元素的数组中,在其第 6 个位置插入数字 7 。
算法逻辑:
- 第一步,找出元素要插入的位置。
- 第二步,将插入位置的元素以及后面的元素全部往后移位。
① 伪代码
算法:InsertionElement(arr[], target)
目的:在数组中的第 6 个位置插入一个元素 7
前提:给定数组的大小 n = 10 ,数组中元素的个数为 9
后续:无
返回值:无
{
//数组元素下标变量
i <-- 8
//第6个位置的元素极其以后元素后移
while ( i >= 6)
{
// 往后移位
arr[i+1] <-- arr[i]
//数组从后往前遍历移位,空出第三个位置,结束循环
i--
}
//将目标元素插入第合适的个位置
arr[i+i] = target
}
② 代码
#include<stdio.h>
void InsertionElement(int* arr, int target);
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 8, 9, 10};
//定义插入的目标元素
int target = 7;
//将数组和 target 传入函数
InsertionElement(arr,target);
//打印插入元素后的数组
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
void InsertionElement(int* arr, int target )
{
//定义数组元素下标变量
int i = 8;
//第 6 个位置的元素极其以后元素后移
while ( i == 6 || i > 6)
{
//移位
arr[i + 1] = arr[i];
i--;
}
//将目标元素插入合适的位置
arr[i+1] = target;
}
3、数组元素的删除
在数组中删除一个元素,就像插入操作一样冗长和棘手。例如,在 9 个元素的数组中,删除数字 7 。
算法逻辑:
- 第一步,找到要删除元素的位置。
- 第二步,将删除位置的元素以及后面的元素全部往前移位。
- 第三步,因为删除了一个元素,所以在数组最后一位补 0,以免出现随机数。
① 伪代码
算法:DeletionElement(arr[], target)
目的:数组中有两个重复的数字 7,删除第一个 7
前提:给定数组的大小 n = 11 ,数组中元素的个数为 10
后续:无
返回值:无
{
//第一步,找到删除元素的位置
loop( 遍历数组的结束条件)
{
if( target == x)
{
//用变量 m 来接受数组下标,即删除元素的位置
m <-- i
}
}
//第二步,将删除位置的元素以及后面的元素全部往前移位。
loop( 删除位置的判断条件 )
{
arr[m] = arr[m+1]
}
//第三步,因为删除了一个元素,所以在数组最后一位补 0,以免出现随机数。
arr[10] = 0
}
② 代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void DeletionElement(int* arr, int n, int target);
int main()
{
int arr[11] = { 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10 };
//定义删除的目标元素
int target = 7;
//将数组、数组的大小和 target 传入函数
DeletionElement(arr, 11,target);
//打印已经删除元素的数组
for (int i = 0; i < 11; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
void DeletionElement(int* arr, int n, int target)
{
//第一步,找到删除元素的位置
//定义一个变量 m,用来接受数组下标,即删除元素的位置
int m = 0;
for (int i = 0; i < 11; i++)
{
if (arr[i] == target)
{
m = i ;
}
}
//第二步,将删除位置的元素,以及后面的元素全部往前移
while ( m < 11 )
{
arr[m] = arr[m + 1];
m++;
}
//第三步,因为删除了一个元素,所以在数组最后一位补 0,以免出现随机数
arr[10] = 0;
}
4、数组元素的检索
检索操作就是随便的存取一个元素,达到检查或者复制元素的目的。与插入和删除操作不同,当数据结构是一个数组时,检索是一个很容易的操作。实际上,数组是随机存取结构,这意味着数组的每个元素可以随机地被存取,而不需要存取该元素前面的元素或者后面的元素。例如,如果检索数组中第 3 个元素的值,只用一行代码能够做到,其代码如下:
retrieve_value = arr[ 3 ];
5、数组元素的遍历
数组的遍历指的是,被应用于数组中每个元素上的操作,如读、写、应用数学的运算等。
(1) 小试牛刀:打印数组中每个元素
① 索引法
通过数组元素的下标,对数组进行打印。
#include<stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//计算数组中元素的个数
int sz = sizeof(arr)/sizeof(arr[0]);
//打印数组
for(int i = 0; i < sz; i++)
{
printf("%d",arr[ i ]);
}
return 0;
}
② 指针法
先获取数组中第一个元素的地址,存入指针变量中,然后指针变量 +1 ,即数组位置后移一位。
#include<stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//取数组第一个元素的地址
int* p = &arr[0];
//求取数组的大小
int sz = sizeof(arr) / sizeof(arr[0]);
//打印数组
for (int i = 0; i < sz; i++)
{
printf("%d ", *(p+i));
}
return 0;
}
(2)大显身手:求数组中元素的平均值
① 伪代码
算法:ArrayAverage(arr[],n)
目的:求数组中元素的平均值
前提:给定一个数组 Array 和元素的个数 n
后续:无
返回:平均值
{
//数组元素下标
i <-- 0
//求和变量
sum <-- 0
//遍历求和
loop ( 满足遍历数组的条件 )
{
sum <-- sum + arr[i]
i <-- i + 1
}
average <-- sum/n
return average
}
② 代码
#include<stdio.h>
int ArrayAverage(int* arr, int sz);
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//求取数组的大小
int sz = sizeof(arr) / sizeof(arr[0]);
//将数组传入函数
int average = ArrayAverage(arr, sz);
//打印平均值
printf("%d", average);
return 0;
}
int ArrayAverage(int* arr, int sz)
{
int sum = 0;
int average = 0;
for (int i = 0; i < sz; i++)
{
sum = sum + arr[i];
}
//求平均值
return average = sum / sz;
}
6、总结
今天分享总结了数组的操作,一般情况下,算法具有通用性;各位读者可以拷贝上述例子所用代码,然后改变相应的条件,运行代码,看看能否出现预期的结果。我们下期再见!!!