C语言Day7学习笔记

C语言Day7学习笔记

1、数组改进递归思想解决斐波那契数列

在用递归思想解决斐波那契数列时,因为重复计算过多,导致程序运行速度极慢,甚至无法得出结果,对此,可以用数组储存已经计算出来的结果,从而提高性能

int arr[31] = { 0 };// 下标从0开始,到长度-1  arr[30]
int homework3(int n) {
    // 斐波那契数列  1 1  2 3 5 8 13   f(n)=f(n-1)+f(n-2) n>=3
    // 递归终止的条件
    if (n == 1 || n == 2) {
        arr[n] = 1;
        return 1;
    }
    // 递归操作
    if (arr[n] == 0) {
        arr[n] = homework3(n - 1) + homework3(n - 2);
    }
    return arr[n];
}

2、二维数组

(1)注意:二位数组的定义与初始化,在定义二维数组时,可以不标明行下标,但不能不标明列下标

在声明数组时,则必须写明数组的行标和列标

int arr[3][4]={1,2,3,4};
int arr[3][5]={{1,2},{4,5}};
int arr[][4]={{2,3},{1,2}};

故以上都为正确的数组定义及初始化

(2) 数组名代表地址,第一行第一列元素的地址

(3)获取数组的长度

int length = sizeof(arr2) / sizeof(arr2[0]);

获取列数

int cells = sizeof(arr2[0]) / sizeof(arr2[0][0]);

(4)二维数组实际上代表了一个矩阵,例如

int arr[a][b]; 

则代表了一个a行b列的矩阵

(5)冒泡排序

很多时候,我们在写代码时,会将数组作为参数进行传递,比如:实现一个冒泡排序函数对一个整型数 组进行排序。

冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一 个。这个数就会从序列的最右边冒出来。 以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第 二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。

在这里插入图片描述

//冒泡排序
void bubbleSort(int* p_arr, int size) {
    // 循环的轮数
    for (int i = 1; i < size; i++) {
        // 每一轮比较的次数
        for (int j = 0; j < size - i; j++) {
            if (p_arr[j] > p_arr[j + 1]) {
                int temp = p_arr[j];
                p_arr[j] = p_arr[j + 1];
                p_arr[j + 1] = temp;
            }
        }
    }
}

(6)插入排序

在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。按照此法对所有元素进行插入,直到整个序列有序。但我们并不能确定待排元素中究竟哪一部分是有序的,所以我们一开始只能认为第一个元素是有序的,依次将其后面的元素插入到这个有序序列中来,直到整个序列有序为止。

void InsertSort(int* arr, int n)
{
    for (int i = 0; i < n - 1; ++i)
    {
        //记录有序序列最后一个元素的下标
        int end = i;
        //待插入的元素
        int tem = arr[end + 1];
        //单趟排
        while (end >= 0)
        {
            //比插入的数大就向后移
            if (tem < arr[end])
            {
                arr[end + 1] = arr[end];
                end--;
            }
            //比插入的数小,跳出循环
            else
            {
                break;
            }
        }
        //tem放到比插入的数小的数的后面
        arr[end  + 1] = tem;
        //代码执行到此位置有两种情况:
        //1.待插入元素找到应插入位置(break跳出循环到此)
        //2.待插入元素比当前有序序列中的所有元素都小(while循环结束后到此)
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值