数组和相关算法

数组

1. 数组概述
1.1 数组引入描述

水上乐园物品存放区

在这里插入图片描述

1.2 C 语言数组定义格式
// 格式
数据类型 数组名[常量容量] = {满足数据类型要求的初始化数据};
  • 数据类型:明确告知当前数组存储的数据类型是哪一个类型,要求存放的数据只能是当前数据类型,严格遵守数据类型一致化原则。
  • 数组名:操作数据使用的对应名称
    1. 数组名在一定范围以内具备唯一性
    2. 数组名是一个【指针变量】,存储当前数组在内存中的【首地址】
  • [常量容量]:决定当前数组的容量,允许最多多少个指定数据类型存储,并且数组容量一旦确定,无法修改。
    • 如果使用的版本为 C89 版本,当前数组容量有且只支持常量形式,不允许存在变量情况
    • 如果使用的版本为 C99 以上,数组容量可以支持变量形式,允许后续代码提供对应的容量数据
  • 满足数据类型要求的初始化数据:数组在使用之前,必须保证首先进行对应的赋值操作
2. 数组案例和使用操作

数组案例

int arr[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
2.1 数组操作【重点】
需要通过 数组名[有效下标] 的方式操作数组中每一个下标对应的元素。

【有效下标】
	从 0 开始到数组的容量 - 1
	例如:
		int arr[10] 是容量为 10 的数组,对应的有效下标范围是 0 ~ 9 ,超出对应的下标范围,操作越界,非法!!!有可能导致【段错误(核心已转储)】
	比较常用的非法下标 -1 ,使用非法下标常用于提示代码中操作存在一定的问题。
#include <stdio.h>

int main(int argc, char * argv[])
{
	/*
	 * 数组格式:
	 *	数据类型 数组名[常量容量] = {满足数据类型要求初始化数据};
	 */
	int arr[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};

	// 取值数组 arr 中下标为 5 的元素数据展示
	printf("arr[5] = %d\n", arr[5]);
	
	// 给予数组中下标为 5 的元素进行赋值操作
	arr[5] = 200;

	printf("arr[5] = %d\n", arr[5]);
}
2.2 数组操作常见错误
#include <stdio.h>

int main(int argc, char * argv[])
{
	int arr[10];
	// 数组中的元素未赋值的情况下直接使用,存在【野值隐患】
	printf("arr[5] = %d\n", arr[5]);

	// 以下两个操作都是数组下标越界问题,有可能存在数据内容,也有可能会导致
	// 段错误(核心已转储),避免数组操作下标越界!!!
	printf("arr[10] = %d\n", arr[10]);
	printf("arr[-1] = %d\n", arr[-1]);
}
3. 数组和循环

数组和 for 循环之间关系非常密切

for (循环条件初始化; 循环条件判断; 循环条件修改) 
{}

循环条件初始化 从数组下标 0 开始
循环条件判断 限制循环变量在有效下标以内
循环条件修改 步进关系/递增关系为 1

for 循环操作数组,完成赋值和取值的案例

#include <stdio.h>

int main(int argc, char const *argv[])
{   
    // 定义了一个 int 类型数组,容量为 10,数组名为 arr
    // 同时采用 {0} 方式对于数组中元素进行必要初始化操作
    int arr[10] = {0}; 

    // 【模块一】for 循环给予数组中每一个元素进行赋值操作
    for (int i = 0; i < 10; i++)
    {
        // 使用 2 * i 数据赋值数组中下标为 i 的元素
        arr[i] = 2 * i;
    }

    // 【模块二】for 循环遍历整个数组,展示数组中每一个元素存储的数据情况
    for (int i = 0; i < 10; i++)
    {
        printf("arr[%d] = %d\n", i, arr[i]);
    }

    return 0;
}
4. 数组作为函数参数【重点】

C/C++ 要求,如果数组作为函数的参数,必须提供一组数据/两个参数

  • 数组本身
  • 数组对应的容量
#include <stdio.h>

/*
给予 int 类型数组进行赋值操作函数

@param arr      用户提供的 int 类型数组
@param capacity 用户提供的数组容量
*/
void assign_int_array(int arr[], int capacity);

/*
在控制台展示用户提供的 int 类型数组

@param arr      用户提供的 int 类型数组
@param capacity 用户提供的数组容量
*/
void print_int_array(int arr[], int capacity);

/*
argc:int
argv:char * []
    arg ==> argument 参数
    argc ==> argument count 参数个数
    argv ==> argument value 参数数据/参数值
        argv 是一个数组,存在多个数据

    argc 就是用于提示告知当前 argv 数组的容量
*/
int main(int argc, char const *argv[])
{
    int arr[10] = {0};

    /*
    调用形式参数为数组类型的函数
    需要提供给函数的实际参数
        1. 数组名 ==> 提供了整个数组
        2. 数组容量 ==> 作为限制数组操作下标范围的条件
    */
    assign_int_array(arr, 10);
    print_int_array(arr, 10);

    return 0;
}

void assign_int_array(int arr[], int capacity)
{
    for (int i = 0; i < 10; i++)
    {
        // 使用 2 * i 数据赋值数组中下标为 i 的元素
        arr[i] = i * 2;
    }
}

void print_int_array(int arr[], int capacity)
{
    for (int i = 0; i < 10; i++)
    {
        printf("arr[%d] = %d\n", i, arr[i]);
    }
}

5. 数组相关算法实现【重点】
5.1 数组相关算法概述

需要完成基于数组的增删改查【CRUD】操作,需要完成的功能

  • 指定元素搜索,指定下标数据获取
  • 添加数据,删除数据,指定下标添加,指定下标删除
  • 多数据信息获取,多数据信息删除/添加
  • 数组扩容机制
  • 排序操作【选择,冒泡,快速排序】
5.2 找出指定元素在数组中的下标位置
int arr[10] = {1, 3, 5, 7, 9, 2, 5, 6, 8, 10};
/*
在数组中搜索
	搜素指定元素 5,对应下标 2
	搜索指定元素 6,对应下标 7
	搜索指定元素 20,返回结果 -1【告知调用者,目标数据不存在!!!】

对于结果
	1. 如果结果大于等于 0 表示目标数据在数组中存在
	2. 如果结果为 -1 表示对应数据不存在。
*/
#include <stdio.h>

int main(int argc, char const *argv[])
{
    // 查询数据的目标数组
    int arr[10] = {1, 3, 5, 7, 9, 2, 5, 6, 8, 10};
    // 用户指定的查询目标数据
    int num = 5; 

    // 搜索功能模块
    /*
    1. 定义一个 int 类型变量 index ,用于存储指定目标数据下标位置,并且
    当前变量初始化为 -1,如果在循环搜索过程中,找到目标元素,index 存储
    对应下标位置,如果没有找到 index 依然是 -1

    后续代码中就可以利用 index 数据存储情况进行判断
        · index 如果大于等于 0 表示找到目标数据
        · index 存储结果为 -1 表示目标数据不存在
    
    【标记思想】
    */
    int index = -1;

    // 2. 利用 for 循环遍历整个数组,利用 if 判断,找出目标元素
    for (int i = 0; i < 10; i++)
    {
        /* 
        利用 if 判断,如果目标元素和当前数组对应下标元素一致
        index 存储对应下标位置,并且使用 break 跳出循环结构
        */
        if (num == arr[i]) 
        {
            index = i;
            break;
        }
    }

    // 可以根据 index 的数据结果判断对应元素是否存在
    if (index > -1) 
    {
        printf("目标元素所在下标位置: %d\n", index);
    } 
    else 
    {
        printf("指定元素不存在!\n");
    }
    
    return 0;
}
5.3 找出指定元素在数组中最后一次出现的下标位置
int arr[10] = {1, 3, 5, 7, 9, 2, 5, 6, 8, 10};
/*
在数组中搜索
	搜素指定元素 5,最后一次出现的下标 6
	搜索指定元素 6,对应下标 7
	搜索指定元素 20,返回结果 -1【告知调用者,目标数据不存在!!!】

对于结果
	1. 如果结果大于等于 0 表示目标数据在数组中存在
	2. 如果结果为 -1 表示对应数据不存在。
*/
#include <stdio.h>

int main(int argc, char const *argv[])
{
    // 查询数据的目标数组
    int arr[10] = {1, 3, 5, 7, 9, 2, 5, 6, 5, 10};
    // 用户指定的数据
    int num = 5;

    // 1. 定义一个 int 类型变量 index 初始化为 -1 【标记变量】
    // 如果找到目标元素,index 最终结果大于 -1,否则 index 依然是 -1
    int index = -1;

    // 2. 逆序遍历整个数组,从最大有效下标位置开始,到 0 结束
    for (int i = 10 - 1; i >= 0; i--) 
    {
        // 找到目标元素,index 存储对应下标位置,并且 break 终止循环
        if (num == arr[i])
        {
            index = i;
            break;
        }
    }

    // 根据 index 的数据存储情况,判断目标数据是否找到
    if (index > -1) 
    {
        printf("指定元素在数组中最后一次出现的下标位置: %d\n", index);
    }
    else
    {
        printf("目标元素未找到!\n");
    }

    return 0;
}
5.4 找出数组中最大元素所在下表位置
int arr[10] = {1, 3, 5, 7, 19, 2, 5, 6, 8, 10};
/*
找出数组中最大值所在的下标位置,数据查询的范围是当前数据中的所有元素,不得使用其他数据参与当前的搜索操作。

整个程序开始,以数组中下标为 0 的元素作为参照物,遍历整个数组,进行两两比较,每一次比较的结果,留存较大值对应的下标位置。
*/
#include <stdio.h>

int main(int argc, char const *argv[])
{
    // 查询最大值所在下标位置的目标数组
    int arr[10] = {1, 3, 5, 71, 19, 2, 105, 6, 8, 10};    

    // 1. 准备一个变量,用于存储最大值对应的下标位置,当前变量初始化为 0
    // 以下标为 0 的元素作为初始化参照物。
    int index = 0;

    // 2. 遍历整个数组,利用 if 判断进行两两比较,index 保留较大值下标
    /*
    index 初始化为 0,如果循环变量 i 从 0 开始,在 if 条件判断过程中
    相当于 arr[0] < arr[0] 无效无意义,遍历操作,循环开始条件从
    index + 1 开始
    */
    for (int i = index + 1; i < 10; i++) 
    {
        // 当前 index 下标对应的元素,小于下标 i 对应的元素
        if (arr[index] < arr[i]) 
        {
            // index 存储 i 数据
            index = i;
        }        
    }

    // 以上操作结束,可以 100% 确定 index 存储的下标位置就是整个数组中
    // 最大值对应的下标位置。【找极值】
    printf("最大值对应的下标位置: %d\n", index);

    return 0;
}
5.5 找出数组中最小元素所在下表位置
#include <stdio.h>

int main(int argc, char const *argv[])
{
    // 查询最小值所在下标位置的目标数组
    int arr[10] = {1, 3, 5, 71, 19, 2, 105, 6, 8, 10};    

    // 1. 准备一个变量,用于存储最大值对应的下标位置,当前变量初始化为 0
    // 以下标为 0 的元素作为初始化参照物。
    int index = 0;

    // 2. 遍历整个数组,利用 if 判断进行两两比较,index 保留较小值下标
    /*
    index 初始化为 0,如果循环变量 i 从 0 开始,在 if 条件判断过程中
    相当于 arr[0] > arr[0] 无效无意义,遍历操作,循环开始条件从
    index + 1 开始
    */
    for (int i = index + 1; i < 10; i++) 
    {
        // 当前 index 下标对应的元素,大于下标 i 对应的元素
        if (arr[index] > arr[i]) 
        {
            // index 存储 i 数据
            index = i;
        }        
    }

    printf("最小值对应的下标位置: %d\n", index);

    return 0;
}
5.6 数组元素逆序
int arr[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
逆序之后的数据
arr ==> {10, 8, 6, 4, 2, 9, 7, 5, 3, 1};
数据交换位置的次数 = 数组容量 / 2
#include <stdio.h>

/*
在控制台展示用户提供的 int 类型数组

@param arr      用户提供的 int 类型数组
@param capacity 用户提供数组的容量
*/
void print_int_array(int arr[], int capacity);

int main(int argc, char const *argv[])
{
    // 数据逆序操作的原数组
    int arr[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};

    print_int_array(arr, 10);
    printf("--------------------------------------------------------\n");
    // 直接利用循环对数组中的元素进行逆序操作
    for (int i = 0; i < 10 / 2; i++)
    {
        int temp = arr[i];
        arr[i] = arr[10 - 1 - i];
        arr[10 - 1 - i] = temp;
    }

    print_int_array(arr, 10);

    return 0;
}

void print_int_array(int arr[], int capacity)
{
    for (int i = 0; i < capacity; i++)
    {
        printf("arr[%d] = %d\n", i, arr[i]);
    }
}
5.7 使用指定元素替换指定下标元素
int arr[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
/*
用户指定替换元素的下标位置  5,替换使用的新元素 20,最终结果
	1. 需要知晓被替换的元素情况
	2. 数组的数据内容替换之后
		{1, 3, 5, 7, 9, 20, 4, 6, 8, 10}

【隐含一定的条件约束】
	对用户提供的下标数据进行合法性判断
*/
#include <stdio.h>
// C 语言标准库头文件
#include <stdlib.h>

/*
在控制台展示用户提供的 int 类型数组

@param arr      用户提供的 int 类型数组
@param capacity 用户提供数组的容量
*/
void print_int_array(int arr[], int capacity);

int main(int argc, char const *argv[])
{
    // 替换数据的原数组
    int arr[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
    // 用户指定替换的下标位置
    int index = 5;
    // 用户替换使用的数据
    int num = 20;

    print_int_array(arr, 10);
    printf("-------------------------------------------------------\n");

    // 1. 【重点】用户指定下标合法性判断
    if (index > 10 - 1 || index < 0)
    {
        printf("用户提供的下标数据非法!\n");
        // EXIT_FAILURE 退出状态,表示程序以运行失败状态退出
        return EXIT_FAILURE;
    }

    // 2. 首先取值被替换下标位置的元素数据情况
    int temp = arr[index];

    // 3. 使用新数据直接替换原本的数据内容
    arr[index] = num;

    print_int_array(arr, 10);
    printf("被替换的数据为: %d\n", temp);

    return 0;
}
5.8 使用指定新元素,替换数组中指定的所有老元素
int arr[10] = {1, 3, 5, 1, 3, 5, 1, 3, 5, 1};
/*
用户指定替换的老元素为 1,替换使用的新元素为 10
最终替换之后的结果为
	{10, 3, 5, 10, 3, 5, 10, 3, 5, 10}
*/
#include <stdio.h>

int main(int argc, char const *argv[])
{
    // 替换数据的原数组
    int arr[10] = {1, 3, 5, 1, 3, 5, 1, 3, 5, 1};
    // 用户指定的原(old)数据
    int old_num = 1;
    // 用户指定的新(new)数据
    int new_num = 10;

    print_int_array(arr, 10);
    printf("-------------------------------------------------------\n");

    // 1. 直接利用循环遍历整个数组,找出目标 old_num 元素,
    // 直接替换为 new_num
    for (int i = 0; i < 10; i++)
    {
        // 下标为 i 的元素数据和 old_num 一致
        if (old_num == arr[i])
        {
            // 数组中下标为 i 的元素赋值为 new_num
            arr[i] = new_num;
        }
    }
    print_int_array(arr, 10);

    return 0;
}
5.9 用户指定起始下标和终止下标位置,截取数组中得数据内容,得到新数组
int arr[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
/*
用户指定开始下标为 2,结束下标为 6,得到的新数组数据情况为
	{5, 7, 9, 2}
【隐含一定的条件约束】
	1. 截取数据,结束下标对应的元素在新数组中不存在,要头不要尾 [begin, end)
	2. 用户指定的起始下标和终止下标必须在合法范围以内。
	3. 需要根据用户提供的下标范围,创建一个新的数组,暂时使用 C99 以上版本能力,完成一个临时
	的数组
*/
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    // 截取数据的原数组
    int arr[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
    // 用户指定的开始下标位置
    int begin = 2;
    // 用户指定的终止下标位置
    int end = 6;

    // 1. 判断用户指定的下标位置是否合法
    if (begin > end || begin < 0 || begin > 10 - 1 || end < 0 || end > 10 - 1)
    {
        printf("用户提供的下标数据不合法!\n");
        return EXIT_FAILURE;
    }

    // 2. 计算得到新数组容量,同时创建新的同数据类型数组
    int new_capacity = end - begin;
    int new_array[new_capacity];

    // 3. 利用循环进行数据移动操作,从 begin 开始到 end 结束
    // 要头不要尾 [begin, end)
    /* 
    3.1 定义 int 类型变量 count,作为尾插法变量
        a. 记录有效元素个数 
        b. 作为当前新数组存储数据的下标位置标记
    */
    int count = 0;

    // 3.2 for 循环从 begin 开始到 end 结束,提取数据内容
    for (int i = begin; i < end; i++) 
    {
        new_array[count++] = arr[i];
    }

    // 查询数据情况
    print_int_array(new_array, count);

    return 0;
}
2.10 数组中指定下标位置添加元素★
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
/*
要求:
	1. 0 是无效元素,仅作为空位置占位使用,不要在添加数据过程中,添加数据 0 
	2. 添加数据 20 到下标为 6 的位置,数组中数据结果的情况
		{1, 2, 3, 4, 5, 6, 20, 7, 8, 9}
*/

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    // 插入数据的目标数组,最后一个数据为 0 表示空位置
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
    // 用户指定插入数据的下标位置
    int index = 3;
    // 用户指定插入的数据
    int num = 20;

    print_int_array(arr, 10);
    printf("-------------------------------------------------------\n");

    // 1. 用户提供数据合法性判断
    if (index < 0 || index > 10 - 1)
    {
        printf("提供的下标数据不合法!\n");
        return EXIT_FAILURE;
    }

    // 2. 利用 for 循环移动数据内容,腾出对应的插入数据位置
    /*
    循环从数组中最后一个位置开始,到用户指定插入数据的下标位置结束
    */
    for (int i = 10 - 1; i > index; i--)
    {
        arr[i] = arr[i - 1];
    }

    // 3. 用户指定下标位置赋值目标数据
    arr[index] = num;

    print_int_array(arr, 10);

    return 0;
}
2.11 删除数组中指定下标元素★
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
/*
要求:
	1. 0 是无效元素,仅作为空位置占位使用
	2. 删除数组中下标为 6 的元素
		a. 需要告删除的数据情况
		b. 数组元素被删除之后的数据形式
		删除下标 5
		数据情况 {1, 2, 3, 4, 5, 7, 8, 9, 10, 0}
		数据向前移动,同时原本最后一个有效元素位置 0 占位表示空
*/

在这里插入图片描述

/*
2.11 删除数组中指定下标元素

int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
要求:
    1. 0 是无效元素,仅作为空位置占位使用
    2. 删除数组中下标为 6 的元素
        a. 需要告删除的数据情况
        b. 数组元素被删除之后的数据形式
        删除下标 5
        数据情况 {1, 2, 3, 4, 5, 7, 8, 9, 10, 0}
        数据向前移动,同时原本最后一个有效元素位置 0 占位表示空
*/
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    // 删除数据的目标数组
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    // 用户指定删除数据的下标位置
    int index = 2;

    print_int_array(arr, 10);
    printf("-------------------------------------------------------\n");

    // 1. 针对于用户指定的删除数据下标位置进行合法性判断
    if (index < 0 || index > 10 - 1)
    {
        printf("用户提供的下标数据有误!\n");
        return EXIT_FAILURE;
    }

    // 2. 将用户指定下标删除的数据提取,用户知晓目标下标,但是并
    // 不知道下标对应的数据情况。
    int temp = arr[index];

    // 3. 利用循环从用户指定删除位置开始,到数组最后一个有效位置结束
    // 执行循环,数据整体向前移动
    for (int i = index; i < 10 - 1; i++)
    {
        arr[i] = arr[i + 1];
    }

    // 4. 原本最后一个有效元素位置赋值为 0,作为空位置
    arr[10 - 1] = 0;

    // 被删除的数据情况和目前数组中的数据情况
    printf("被删除的数据 %d\n", temp);
    print_int_array(arr, 10);

    return 0;
}
2.12 删除数组中所有指定元素★
int arr[10] = {1, 3, 5, 1, 3, 5, 1, 3, 5, 7};
/*
要求:	
	1. 0 是无效元素,仅作为空位置占位使用
	2. 删除数组中所有指定元素,例如 删除数据 1,数组的数据情况
	{3, 5, 3, 5, 3, 5, 0, 0, 0, 0}
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    // 删除数据的目标数组
    int arr[10] = {1, 3, 5, 1, 3, 5, 1, 3, 5, 1};
    // 用户指定的目标删除元素
    int num = 1;

    print_int_array(arr, 10);
    printf("-------------------------------------------------------\n");
    /*
    1. 【核心变量】
        尾插法的特殊使用
        a. 记录当前数组中有多少个不被删除的元素
        b. 保留元素在数组中存储的下标位置标记
    */
    int count = 0;

    // 2. 利用 for 循环遍历整个数组,保留非目标删除元素
    for (int i = 0; i < 10; i++)
    {
        if (arr[i] != num)
        {
            arr[count++] = arr[i];
        } 
    }

    // 内存设置/擦除函数 memset(void * ptr, char ch, int n); 
    memset(arr + count, 0, sizeof(int) * (10 - count));
    // memset(&arr[count], 0, sizeof(int) * (10 - count));
    
    print_int_array(arr, 10);
    return 0;
}
2.13 添加新数组内容到当前数组中★
int arr[10] = {1, 3, 5, 7, 9, 0, 0, 0, 0, 0};
int new_arr[3] = {2, 4, 6};
/*
要求
	添加 new_arr 到 arr 下标为 3 的位置,最终 arr 数组数据形式
	{1, 3, 5, 2, 4, 6, 7, 9, 0, 0};
*/

在这里插入图片描述

// C 语言项目头文件三贱客
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    // 添加数据的 target 目标数组
    int target_arr[10] = {1, 3, 5, 7, 9, 0, 0, 0, 0, 0};
    // 添加数据的 source 源数组
    int source_arr[3] = {2, 4, 6};
    // 用户指定的下标位置
    int index = 3;

    // target 目标数组容量
    int target_arr_capacity = 10;
    // target 目标数组有效元素个数
    int target_arr_size = 5;

    // source 源数组容量
    int source_arr_capacity = 3;
    // source 源数组有效元素个数
    int source_arr_size = 3;

    /*
    以上数组中有几个隐含条件
        1. target 目标数组容量为 10 ,有效元素个数为 5
        2. source 源数组容量为 3,有效元素个数为 3
    */
    // 1. 用户指定下标位置合法性判断,控制的有效范围是 target 目标数组的有效
    // 元素个数以内,允许的范围是 0 ~ 5 
    if (index < 0 || index > target_arr_size)
    {
        printf("用户指定下标数据不合法!\n");
        return EXIT_FAILURE;
    }
    // 2. 需要确定 source 源数组容量 + target 目标数组有效元素个数 <=  target 目标数组容量
    if (source_arr_size + target_arr_size > target_arr_capacity)
    {
        printf("源数组和目标数组数据个数大于目标数组容量,越界!\n");
        return EXIT_FAILURE;
    }

    // 3. 核心步骤一,target 目标数组从插入数据位置开始,根据 source 源数组
    // 有效元素个数进行数据向后移动
    for (int i = target_arr_size - 1; i >= index; i--) 
    {
        // target 目标数组的移动下标是当前下标 i + source 源数组容量
        target_arr[i + source_arr_size] = target_arr[i];
    }

    // 4. 核心步骤二,source 源数组数据根据用户指定下标位置,放入到 target 目标数组中
    for (int i = 0; i < source_arr_size; i++)
    {
        target_arr[index++] = source_arr[i];
    }

    print_int_array(target_arr, target_arr_capacity);
    return 0;
}
2.14 找出指定元素在数组中的所有下标位置,存储到另一个数组中★
int arr[10] = {1, 3, 5, 1, 3, 5, 1, 3, 5, 1};
/*
要求
	找出元素 1 在数组中出现的所有下标位置
	{0, 3, 6, 9};
*/

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    // target 目标数组
    int arr[10] = {1, 3, 5, 1, 3, 5, 1, 3, 5, 1};
    // 用户指定的目标元素
    int num = 1;
    
    // 思路一: 空间换时间
    // 准备一个和 target 目标数组容量一致的数组,循环一次解决问题
    int index_arr1[10] = {0};

    // 利用尾插法将数据存储到 index_arr1
    int count = 0; 

    for (int i = 0; i < 10; i++) 
    {
        if (num == arr[i])
        {
            index_arr1[count++] = i;
        }
    }

    // 展示数据
    print_int_array(index_arr1, count);
    printf("------------------------------------------------\n");

    // 思路二: 时间换空间
    count = 0;

    // 利用 for 循环找出目标元素个数
    for (int i = 0; i < 10; i++) 
    {
        if (num == arr[i])
        {
            count++;
        }
    }

    // 根据 count 目标元素个数创建对应的数组,如果count 为 0 终止运行。
    if (0 == count)
    {
        return EXIT_FAILURE;    
    }

    int index_arr2[count];

    // 在执行一次循环,找出目标数据所在的下标位置,存储到 index_arr2 中
    count = 0;
    for (int i = 0; i < 10; i++) 
    {
        if (num == arr[i])
        {
            index_arr2[count++] = i;
        }
    }

    print_int_array(index_arr2, count);

    return 0;
}
6. 作业
  • 冒泡排序
  • 选择排序
  • 快速排序【重难点】
  • 二分法查询
  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值