C语言-11

-seventy- / 2023-07-15 / 原文

基本了解

/*
    学习内容:
        冒泡排序(最基本的排序方法)
        选择排序(冒泡的优化)
        插入排序(在合适的位置插入合适的数据)
*/

/*
    排序分类:
        1.内部排序
            待需要进行排序的数据全部存放到内存中,再进行排序 
        2.外部排序
            在排序过程中,需要对外存进行访问
            待排序的数据数量很大,内存无法全部容纳所有的数据 
*/

冒泡排序

/*
    冒泡排序:
    ---思路分析(以升序为例)
        在一排数据中,将第一个与第二个比较大小
        如果后面的数据比前面的小,就交换它们的位置(冒泡一次)
        然后比较第二个和第三个
        ...
        直到比较第 n-1 个数据和第 n 个
        每一次比较都将较大的一个数据向后移动
        所以第 n 个是最大的
        所以就排好了一个数据(冒泡一趟)
*/

# include <stdio.h>

int main()
{
    // 定义一个无序一维数组
    int arr[] = { 5, 7, 9, 1, 6, 2, 4, 3, 0, 8 };
// 遍历,打印数组 printf("数组,排序前:\n"); for (int i = 0; i < 10; i++) { printf("%-3d", arr[i]); }
// 冒泡排序(升序:由小到大) int temp; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9 - i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } }
// 展示排序后,数组当前的结果 printf("数组,排序后:\n"); for (int i = 0; i < 10; i++) { printf("%-3d", arr[i]); } }

选择排序

/*
    选择排序:
    ---思路分析(以升序为例)
            选择排序可以看作是冒泡排序的优化
        不再多次交换值,而是选择当前趟数的最大(或最小值),最后再交换
            在 n 个数里,先找到最大的数,并且记录下标,然后将这个数与第 n 个数交换
        如果第 n 个数是最大的,那就不需要交换,重复比较,直到所有的数据排好序
*/

# include <stdio.h>

int main()
{
    // 定义一个无序一维数组
    int arr[] = { 5, 7, 9, 1, 6, 2, 4, 3, 0, 8 };


    // 遍历,打印数组
    printf("\n 数组,排序前:\n");
    for (int i = 0; i < 10; i++)
    {
        printf("%-3d", arr[i]);
    }


    // 选择排序(升序:由小到大)---> 选择排序:选择一个你认为最大的数
    int temp;
    int maxIndex;
    for (int i = 9; i > 0; i--)
    {
        maxIndex = 0;    // 每次我都认为第一个最大,选择第一个,并记录下第一个的序号
        for (int j = 0; j <= i; j++)
        {
            if (arr[maxIndex] < arr[j])
            {
                maxIndex = j;
            }
        }

        if (maxIndex != i)
        {
            temp = arr[i];
            arr[i] = arr[maxIndex];
            arr[maxIndex] = temp;
        }

    }
    

    // 展示排序后,数组当前的结果
    printf("\n 数组,排序后:\n");
    for (int i = 0; i < 10; i++)
    {
        printf("%-3d", arr[i]);
    }

}

插入排序