数组的操作-集大成篇

目录

1、数组元素的查找

2、数组元素的插入

 ①  伪代码

②  代码 

3、数组元素的删除

①  伪代码

②  代码 

4、数组元素的检索

5、数组元素的遍历

(1)  小试牛刀:打印数组中每个元素

①  索引法

②   指针法

(2)大显身手:求数组中元素的平均值

① 伪代码

②  代码

6、总结 


数组作为一种数据结构,有常用的 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、总结 

        今天分享总结了数组的操作,一般情况下,算法具有通用性;各位读者可以拷贝上述例子所用代码,然后改变相应的条件,运行代码,看看能否出现预期的结果。我们下期再见!!!

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aperion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值