c语言中static的作用以及(递归,八大算法原理)

static在c中的重要作用

//下面main.a
char a = 'A';

    void msg()

    {

        printf("Hello\n");

    }
    int main(void)    {

        extern char a;

        printf("%c",a);

        (void)msg();

        return 0;

    }

 隐藏

  • main.a在a和msg的定义前加上static后,main.c中不能访问到他们了,利用这一特性可以在不同文件中定义同名的函数和变量,对于函数来说只有隐藏的作用,而对于变量还多出两个作用

保持变量内容的持久(全局变量)

  • 存储在静态数据区的变量会在程序开始运行时就完成初始化,且该变量的内存只会分配一次,因此其值在下次调用时仍维持上此的值

static的第三个作用是默认初始化为0

  • 其实全局变量也有这一属性,都是在静态数据区,内存中所有的字节默认值都是0x00。某些时候可以减少程序员的工作量。

递归函数代码

#include <stdio.h> // 告诉编译器printf函数的格式, 声明printf函数

int main(int argc, const char * argv[]) {
    /*
     有5个人坐在一起,问第5个人多少岁?他说比第4个人大两岁。问 第4个人岁数,他说比第3个人大两岁。问第3个人,又说比第2个 人大两岁。问第2个人,说比第1个人大两岁。最后问第1个人, 他说是10岁。请问第5个人多大?
     
     第一个人得岁数 == 10
     第二个人得岁数 == 第一个人 + 2  // 12
     第三个人得岁数 == 第二个人 + 2  // 14
     第四个人得岁数 == 第三个人 + 2  // 16
     第五个人得岁数 == 第四个人 + 2  // 18
     
     age(n) = age(n - 1) + 2;
     
     */
    
    int result = age(3);
    printf("result = %i\n", result);
    return 0;
}
/*
递归函数必须满足以下2个特点 1.必须有一个明确的结束标志 2.自己调用自己 */ int age(int n) // 3 2 1 { // 定义结束条件 if (n == 1) { return 10; }else { // return 14; // return 12; return age(n - 1) + 2; } }

冒泡排序代码

int main(int argc, const char * argv[]) {
    int number[6] = {21,42,13,56,72,29};
    hjh_short(number, 6);
    int i;
    for (i = 0; i < 6; i ++) {
        printf("%d\n",number[i]);
    }
    printf("\n");
    
    return 0;
}
/*
 冒泡就是两两比较取大的在前
 */
void hjh_short(int a[],int n)
{
    int i,j,temp;
    
    for (j = 0; j < n - 1; j ++) {
        for (i = 0; i < n - 1 - j; i ++) {
            if (a[i] > a [i + 1]) {
                temp = a[i + 1];
                a[i + 1] = a[i];
                a[i] = temp;
            }
        }
    }
}

选择排序代码

// 选择排序就是拿定义k=i,拿a[k]与后面的数比较,a[k]较大时,a[k]>a[j],k = j就互换位置,最后看k=i是否成立,不能再交换了,比冒泡效率高一点
void choise(int *a,int n) 

{ 

int i,j,k,temp; 

for(i=0;i<n-1;i++) { 

k=i; /*给记号赋值*/ 

for(j=i+1;j<n;j++) 

if(a[k]>a[j]) k=j; /*是k总是指向最小元素*/ 

if(i!=k) { /*当k!=i是才交换,否则a[i]即为最小*/ 

temp=a[i]; 

a[i]=a[k]; 

a[k]=temp; 

} 

} 
}

快速排序代码

//快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。下面分析其

插入排序代码

//插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。

其他排序算法:http://blog.jobbole.com/11745/

posted @ 2016-07-27 23:01  谢云  阅读(516)  评论(0编辑  收藏  举报