太阳不下山 发表于 2021-7-18 21:10:29

c语言_Day17_07_18

c语言_Day17_07_18
1、数组
数组:一组相同类型的元素的集合
type_tarr_name
// 创建1个存放10个整形的数组,并初始化为0
int arr = { 0 };注:数组分配空间时需要传入常量
1、数组的初始化
对于1个创建的数组可对其进行初始化,若初始化元素的个数少于数组开辟的空间则称为不完全初始化
int数组:元素默认值为0
char数组:元素默认值为'\0'
若未对数组指定大小,则必须初始化,编译器根据初始化值来推测数组大小
2、一维数组
一维数组的元素为单个类型的元素(如整形、浮点型、字符等),通过‘[]’操作符对数组元素进行访问int main()
{
        char arr[] = "abcde";
        for (int i = 0; i < (int)strlen(arr); i++)
        {
                printf("%c\n", arr);
        }

        return 0;
}
内存存储:int main()
{
        int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
        int length = sizeof arr / sizeof arr;
        for (int i = 0; i < length; i++)
        {
                printf("&arr[%d] = %p\n", i, &arr);
        }

        return 0;
}通过编译上述代码可知,每个整形数组元素的地址值相差4个字节,即为整形的存储大小
故可推出结论:数组在内存中连续存储
3、二维数组
二维数组的元素为一维数组
arr
理解:

[*]n行m列的二维数组
[*]n个一维数组,每个一维数组共有m个元素
int main()
{
        int arr = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };
        for (int i = 0; i < sizeof arr / sizeof arr; i++)
        {
                for (int j = 0; j < sizeof arr / sizeof arr; j++)
                {
                        printf("%d ", arr);
                }
                printf("\n");
        }

        return 0;
}注:初始化二维数组时,必须指定列的大小
二维数组通过[]操作符访问行(一维数组),通过[][]访问列(元素)
内存存储:int main()
{
        char ch[] = { {'a', 'b', 'c'},{'d', 'e', 'f'} };
        for (int i = 0; i < 2; i++)
        {
                for (int j = 0; j < 3; j++)
                {
                        printf("&ch[%d][%d] = %p\n", i, j, &ch);
                }
                printf("\n");
        }

        return 0;
}通过编译可推得:二维数组在内存中同样连续存储
2、数组中的算法
1、冒泡排序
思想:通过重复走完数组的所有元素,通过打擂台的方式两个两个比较,直到没有数可以交换的时候结束这个数,再到下个数,直到整个数组排好顺序。因一个个浮出所以叫冒泡排序。双重循环时间 O(n^2)。void bubble_sort(int* arr, int len)
{
        for (int i = len; i > 1; i--)
        {
                for (int j = 0; j < i - 1; j++)
                {
                        if (arr > arr)
                        {
                                int ex = arr;
                                arr = arr;
                                arr = ex;
                        }
                }
        }
}

int main()
{
        int arr[] = { 5, 4, 3, 2, 1 };
        int len = sizeof arr / sizeof arr;
        bubble_sort(arr, len);
        for (int i = 0; i < len; i++)
        {
                printf("%d\n", arr);
        }

        return 0;
}
优化:若传入的数组已经有序,使用上述冒泡排序方法相对低效,故可对其进行优化,通过判断提前终止排序void bubble_sort(int* arr, int len)
{
        for (int i = len; i > 1; i--)
        {
                int flag = 1;        // 假设传入的数组已经有序
                for (int j = 0; j < i - 1; j++)
                {
                        if (arr > arr)
                        {
                                int ex = arr;
                                arr = arr;
                                arr = ex;
                                flag = 0;        // 本趟排序的数据不完全有序
                        }
                }
                if (flag)        // 剩余的数据已经有序,可以直接结束排序
                {
                        return;
                }
        }
}

文档来源:51CTO技术博客https://blog.51cto.com/u_15285915/3124062




页: [1]
查看完整版本: c语言_Day17_07_18