(IOS自学)C语言基础学习(一)

函数:

.关于自定义函数分配空间问题:在形参定义后,并不会立即分配空间,而是在函数被调用时才会真正的分配内存空间

数组:

1。数组名代表数组的地址。(%p——获取数组的地址) 

2。先定义的数组在内存单元里分配高地址,后定义的分配低地址。

3.存储方式:

     1)计算机会给数组分配一块连续的存储空间

     2)数组名代表数组的首地址,从首地址位置,一次存入数组的第1个,第2个。。。。第n个元素。

     3)每个元素占用相同的字节数(取决于数组类型)。

     4)并且元素之间的地址是连续的。

4。数组名是一个常量,存储的是数组的首地址

5。数组作为函数参数有两种形式:

       1)一种是把数组元素作为实参使用。

        2)一种是把数组名作为函数的形参和实参使用。(比如定义一个函数的形参为数组,那么调用该函数时使用的实参也必须是数组名)

            注意: 1)在实现实参和形参传递时不是“值传递”,而是“地址传递”,实参数组名将该数组的起始地址传递给形参数组,两个数组共享

                            一段内存单元,编译系统不再为形参分配存储单元。

                        2)数组作为函数参数后,数组的长度信息会丢失,变成地址长度。

                        3)C语言中规定,不管什么数据类型的数据,数据的内存地址在内存中都只占8个字节。

几种排序方法

1.冒泡排序:

思想:大数沉淀,小数气泡。

代码实现:

<span style="font-size:14px;">#include <stdio.h>

//定义一个冒泡的函数
void maoPao(int arr[],int len){

    int temp;
    for (int i=0; i<len-1; i++) {
        for (int j=0; j<len-1-i; j++) {
            if(arr[j]>arr[j+1]){
                temp = arr[j+1];
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

int main(int argc, const char * argv[]) {
    
    int a[10] = {11,21,222,1,33,23,111,232,55,43};
    maoPao(a, 10);
    for (int i=0; i<10; i++) {
        printf("%d\t",a[i]);
    }
    printf("\n");
    return 0;
}
</span>

2.选择排序

思想:

首先在未排列序列中找到最小的元素,放到排序序列的起始位置,然后在再从剩余未排序序列中继续找到最小元素,放到排序序列的尾部。以此类推,直到排序完成!

代码实现:


<span style="font-size:14px;">#include <stdio.h>

//实现选择排序函数
void xuanZhe(int arr[],int len){

    int temp;
    for (int i = 0; i<len-1; i++) {
        for (int j=i+1; j<len; j++) {
            if(arr[i]>arr[j]){
                temp = arr[j];
                arr[j] = arr[i];
                arr[i] = temp;
                
            }
        }
    }
}

int main(int argc, const char * argv[]) {

    int a[10] = {22,11,23,2,33,444,555,44,323,14};
    xuanZhe(a, 10);
    for (int i=0; i<10; i++) {
        printf("%d\t",a[i]);
    }
    printf("\n");
    return 0;
}</span>


折半查找

思想:

在有序表中去中间元素作为比较对象,若给定值和中间值相等,则查找成功;若给定值小于中间元素,则在中间元素左半区继续折半查找;若大于时,则在中间元素的右半区继续折半查找,直到查找成功。若该区域没有相等的元素,则查找失败!


代码实现:

<span style="font-size:14px;">#include <stdio.h>

//折半查找的实现
int zheBan(int arr[],int len,int keyValue){
    
    int low = 0,heigh = len-1,mid ;
    
    while(low<=heigh){
        mid = (low+heigh)/2;
        if (arr[mid]>keyValue) {
            heigh = mid - 1;
        }else if (arr[mid]<keyValue){
            low = mid + 1;
        }else if (arr[mid] == keyValue){
            // 找到相等的值,返回该值在数组的脚标
            return mid;
        }
    }
    //没有找到,返回 -1
    return -1;
}

int main(int argc, const char * argv[]) {

    int a[10] = {11,22,33,44,55,66,77,88,99,1010};
    int keyvalue = 33;
    //数组中与要查找的值的脚标
    int loc = zheBan(a, 10, keyvalue);
    printf("数据在数组中的位置:%d\n",loc);
    
    return 0;
}
</span>

折半查找插入一个值

代码实现:

 

<span style="font-size:14px;">#include <stdio.h>

//折半查找的实现插入一个值返回插入值的位置
int zheBan(int arr[],int len,int keyValue){
    
    int low = 0,heigh = len-1,mid ;
    
    while(low<=heigh){
        mid = (low+heigh)/2;
        if (arr[mid]>keyValue) {
            heigh = mid - 1;
        }else if (arr[mid]<keyValue){
            low = mid + 1;
        }else {
            // 找到相等的值,返回该值在数组的脚标
            return mid + 1;
        }
    }
    //没有找到,返回 -1
    return low;
}
//将需要插入的值插入到数组中去

int insertValue(int arr[],int len,int key,int loc){
    
    
    for (int i=len; i>=loc; i--) {
        arr[i] = arr[i-1];
    }
    arr[loc] = key;
    return 0;
}

int main(int argc, const char * argv[]) {
    //这里定义11个元素,是为了插入一个值
    int a[11] = {11,22,33,44,55,66,77,88,99,1010};
    int keyvalue = 35;
    //要插入值应插入数组中的脚标值
    int loc = zheBan(a, 10, keyvalue);
    //将keyvalue插入到数组中去
    insertValue(a, 11, keyvalue, loc);

    for (int i=0; i<=10; i++) {
        printf("%d\t",a[i]);
    }
    printf("\n");
    return 0;
}
</span>


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值