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循环结束后到此) } }