C语言 数组与冒泡排序

17.数组

   在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。

   在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。

   数组的几个名字:

        1)数组:一组具有相同数据类型的数据的有序的集合;

        2)数组元素:构成数组的数据。

        3)数组的下标:是数组的位置的一个索引或指示;

        4)数组的维数:数组元素下标的个数。根据数组的维数可以氛围一维、二维、三维、多维数组。


②按存储的内容分类

    1)数值数组:用来存储数值

    2)字符数组:用来存储字符'a'

    3)指针数组:用来存放指针(地址)

    4)结构数组:用来存放一个结构体类型的数据


③数组定义的注意事项

    1)数组长度可以是一个常量,也可以是一个常量表达式;

    2)数祖名的命名规则:严格按照标识符的命名规范;

    3)数祖名不能和其他变量同名;

    4)数组的长度不可以为一个变量(C99标准要求),但在Xcode优化下可以;

    5)数组的长度可以使用 宏定义  #define M 5;    int a[M];

    6)在定义数组的时候,还可以定义普通变量。 int x,y,a[];


④数组的初始化

    1)定义同时完全初始化,int a[3] = {1,2,3};  或者 int a[] = {1,2,3,4};  注意:不允许int len =3; int a[len] = {1,2,3};

    2)定义同时部分初始化, int a1[3] = {1,2};   或者 int a1[10] = {[3]=23,[8]=34};(表示下标为3,初值为23;下标为8,初值为34)

    3)先定义,然后在初始化,int a2[2];     a2[1]=1;  a2[2]=2;

如果定义了数组,不进行初始化,里面的值为随机的垃圾数;如果进行部分初始化,没有初始化那部分元素自动被系统初始化为0;

特别强调:使用先定义后初始化的方式,如果部分初始化,系统不会对未初始化的那部分元素进行赋值0的操作。


⑤数组的引用

数组元素是组成数组的基本单元。数组元素也是一种变量。其标识方法为数祖名后跟一个下标。下标表示了元素在数组中的顺序号;

如果要逐个访问数组的元素的话,这就叫数组的遍历


⑥数组的存储方式

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

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

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

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

char字符是以他们的ascll码值进行存储的,先分配的数组地址高。数组地址可以不连续,数组各元素的地址一定是连续的。

    &a[0]第一个元素的地址,a[0]第一个元素的值


⑦一维数组长度计算方法

    int a[] = {1,2,3,4,5}; int len = 0;

    len = sizeof(a) / sizeof(int);


⑧数组名作为函数参数

    在C语言中,数祖名除作变量的标识符之外,数组名还代表了该数组在内存中的起始地址,因此,当数组名作函数参数时,实参和形参之间不是“值传递",而是“地址传递” ,实参数组名将该数组的起始地址传递给形参数组,两个数组共享一段内存单元,编译系统不再为形参数组分配存储单元。

注意点:

    1)形参数组的类型和长度要和实参一致;

    2)形参的数组长度和实参的长度可以不一致,虽不会报错,运行的结果和实际不相符;

    3)形参数组的长度可以不写;

    4)数祖名作为函数参数后,数组的长度信息丢失:在C语言中规定,不管什么类型的数据,数据的内存地址在内存中占用8个字节;


18.冒泡排序(Bubble Sort)

冒泡排序分为:大数下沉小数上浮

//大数下沉

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

        for (int j = 0; j < len-1-i; j++) {

            if (a[j] > a[j+1]) {

                temp = a[j];

                a[j] = a[j+1];

                a[j+1] = temp;

            }

            for (int i = 0; i < len; i++) {

                printf("%d ",a[i]);

            }

            printf("\n");


        }

        printf("\n");

    }


//小数上浮

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

        for (int j = 0; j < len-1-i; j++) {

            if(a[j+1]<a[j]){

                temp = a[j];

                a[j] = a[j+1];

                a[j+1] = temp;

            }

            for (int i = 0; i < len; i++) {

                printf("%d ",a[i]);

            }

            printf("\n");

        }

        printf("\n");

    }


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值