Bootstrap

Linux第一课:c语言 学习记录day06

四、数组

冒泡排序

两两比较,第 j 个和 j+1 个比较

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

第一轮:i = 0   n:n个数,比较 n-1-i 次

4 5 3 2 1 // 第一次比较 j = 0

4 3 5 2 1 // 第二次比较 j = 1

4 3 2 5 1 // 第三次比较 j = 2

4 3 2 1 5 // 第四次比较 j = 3

第二轮:i = 1   n-1-i 次

3 4 2 1 5 // 第一次比较 j = 0

3 2 4 1 5 // 第二次比较 j = 1

3 2 1 4 5 // 第三次比较 j = 2

第三轮:i = 2   n-1-i 次

2 3 1 4 5 // 第一次比较 j = 0

2 1 3 4 5 // 第二次比较 j = 1

第四轮:i = 3   n-1-i 次

1 2 3 4 5 // 第一次比较 j = 0

#include <stdio.h>
#define N 5

int main ()
{
    int temp, i, j;
    int arr[N] = {5, 4, 3, 2, 1};
    for (i = 0; i < N-1; i++)
    {
        for (j = 0 ; j < N-1-i; j++)
        {
            if (arr[j] > arr[j+1])
            {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
    for (i = 0; i < 5; i++)
    {
        printf("%-4d", arr[i]);
    }
    printf ("\n");
    return 0;
}

选择排序

n 个数:先找出最小的值下标暂存,选择出最小的值与 arr [i] 交换

排序过程:

1、首先通过n-1次比较,从n个数中找出最小值的下标,将它与第一个数交换,第一轮选择排序,结果最小值,被放在第一个元素的位置上

2、通过n-2次比较,从剩余的n-1个数中找到最小值的下标做记录,将它与第二个元素交换

3、重复这个过程,共经过n-1论排序后,排序结束

#include <stdio.h>
#define N 5

int main ()
{
    int i, k, j, t, b;
    int a[N] = {1, 2, 3, 4, 5};

    for (i = 0; i < N-1; i++)
    {
        k = i;
        for (j = i+1; j < N; j++)
        {
            if ( a[k] < a[j])
            {
                k = j;
            }
        }
        if ( i != k)
        {
            t = a[i];
            a[i] = a[k];
            a[k] = t;
        }
    }
    for (i = 0; i < N; i++)
    {
        printf("%-4d", a[i]);
    }
    printf ("\n");
    return 0;
}

4、二维数组

1、格式

        存储类型  数据类型  数组名[行数][列数];

        int a[2][3];

2、访问元素

        数组名[行下标][列下标];(下标从0开始)

        a[0][0]:第一行第一列的元素

        a[1][2]:第二行第三列的元素

注意:行下标和列下标都不能越界

        行数可以省略,列数不能省略

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

3、二维数组的元素个数

        1)行数 * 列数

        2)sizeof(数组名)/sizeof(数据类型)

4、二维数组的大小

        sizeof(数组名)

        数据类型的大小 * 行数 * 列数

5、数组名

        a:第一行首地址

        a+1:第二行首地址

        a+n:第 n+1 行首地址

6、初始化

1)全部初始化

        int a[2][3] = {1, 2, 3, 4, 5, 6};        // 顺序赋值

        int a[2][3] = {

                {1, 2, 3},

                {4, 5, 6}

        };        // 按行赋值

2)部分初始化

        未被初始化的元素值为0

        int a[2][3] = {1, 2, 3, 4};        // 顺序赋值

        int a[2][3] = {{1, 2}, {4, 5}}        // 按行赋值

3)未初始化

        随机值,需要单独赋值

        int a[2][3];

7、内存分配

        a是行地址,a[0]是列地址

a:第一行首地址

a+1:第二行首地址

a[0]:第一行第一列的地址

a[0]+1:第一行第二列的地址

a[1]:第二行第一列的地址

a[1]+1:第二行第二列的地址

8、二维数组遍历

        for循环嵌套,外层行数,内层列数

int a[m][n] = {};

for(int i = 0; i < m; i++)
{
    for(int j = 0; j < n; j++)
    {
        scanf();
        printf();
    }
}
;