CSP语法题基础(三)

CSP算法题基础(3)

函数

函数简单介绍

#include<iostream>

using namespace std;
//函数声明
int foo2(int s);//先声明,可以以后再定义。声明的时候变量名s可以不写


//函数定义
int foo(int n){		//int 是返回类型		foo是函数名   int n是形参,通常有0个到多个
    static int cnt =0;	//等价于在函数内部开了一个只有在这个函数内部才能访问的变量,和全局变量一样,不给静态变量赋初值,它一定是0			静态变量和全局变量一样,会开在堆里面
    //		静态变量和全局变量都是定义在堆中,简单来说所有定义在函数里面的变量都是定义在栈中,所有定义在函数外面的都是定义在堆中,堆空间比较大。	但是同样都是定义在堆中的数据,在未被使用时都是处于.bss段中	,未来在使用的时候才会动态分配空间并且初始化成0	//		在函数内部开一个普通数组,如果开的特别大,就会爆栈(栈空间默认1MB);但要是开一个静态数组,它就会开到堆里,堆空间要比栈空间大的多		
    
    
    
    cnt++;
    int res =1;
    for(int i=1;i<n;i++){
        res = res * i;
    }
    return res;		// 不写return 会返回随机值		函数调用是一个入栈过程,每一个函数会占据栈空间里的特定部分,如下图,返回值变量一般会处于两个函数交界部分,要是不写return的值,就不会修改返回值变量的值,所以就会造成没return报随机数
}





//	全局变量定义在整个程序中
//	局部变量,定义在函数,包括main函数里的变量
//	静态变量,定义在函数里,但是无论调用多少次,都只会创建1次的变量,通常用stastic修饰;功能上有点像定义在局部变量的全局变量
//			位置上看似局部变量,功能上看似全局变量


int main(){
    
    int ans = foo(5);
    cout << ans << endl;
    
}

参数传递

  • 非引用传递:函数内部对传入的变量进行改变,函数外部变量值并未发生改变

  • 引用传递:函数内部对传入变量进行代表,会影响到函数外部传入前的值

void swap(int &x,int &y){		//采用引用传递才可以正真实现交换的值
    int t;
    t = x;
    x = y;
    y = t;
}

函数重载:如果定义多个函数重名,C++会认为没有影响,只要函数名,形参都不相同即可

  • 数组参数:可以将一个数组作为参数传递给函数
void output(int m,int a[5]){
    for(int i=0;i<m;i++){
        cout << a[i] << " ";
    }
}


int main(){
    int a[5] = {1,2,3,4,5};
    output(5,a);
    return 0;
}

递归过程部分中间值被算了好多遍,相比与循环效率低;但是递归比较好设计,不用思考循环执行多少遍。比如斐波那契数列,用循环算算到1000多项时间也不长,但是用递归算算到42项左右用时都到1000+ms了

算法#include里面的sort()函数使用的是插入排序和快速排序的一个组合,当数组长度小于20,函数会选择使用插入排序;当数组长度比较大的时候会选择使用使用快速排序;

几种排序算法的复杂度是:

  • 比较慢的:选择排序,插入排序,冒泡排序 时间复杂度是O(n*n)
  • 比较快的:快速排序,归并排序 O(nlogn) 快速排序最坏情况下是O(n*n),归并排序时间复杂度均摊都是O(nlogn)
posted @ 2021-03-10 22:54  _Sandman  阅读(114)  评论(0编辑  收藏  举报