2023-04-21 学习记录--C/C++-实现升序降序(选择法)

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻

一、选择法 —— 升序 ⭐️

在这里插入图片描述

(一)、思路

从左到右,除最后一个数 依次作为 “当前数”其右边所有数 分别比较:

  • 若比右边数,则与该右边数交换位置;否则不交换位置(因为升序是由小到大排序滴)。

(二)、举例一

一、需求 🌈:将 83, 96, 72, 35, 24 五个数使用选择法实现升序(由小到大排序)。

二、实现思路 📚:(从左往右 👉🏻)

  • 1、第1个数作为“当前数”,将其与右边四个数作比较:
    • (1) 先将第1个数与第2个数比较,若比第2个数,则二者交换位置;
    • (2) 后再将当前得到的第1个数与第3个数比较,若比第3个数,则二者交换位置;
    • (3) 后再将当前得到的第1个数与第4个数比较,若比第4个数,则二者交换位置;
    • (4) 后再将当前得到的第1个数与第5个数比较,若比第5个数,则二者交换位置;
  • 【从而使得:第1个数是最小数
  • 2、 除去第1个数,将当前的第2个数作为“当前数”,将其与右边3个数作比较:
    • (1) 先将当前的第2个数与第3个数比较,若比第3个数,则二者交换位置;
    • (2) 后再将当前得到的第2个数与第4个数比较,若比第4个数,则二者交换位置;
    • (3) 后再将当前得到的第2个数与第5个数比较,若比第5个数,则二者交换位置;
  • 【从而使得:第2个数是倒数第2小的数
  • 3、 除去前2个数,将当前的第3个数作为“当前数”,将其与右边2个数作比较:
    • (1) 先将当前的第3个数与第4个数比较,若比第4个数,则二者交换位置;
    • (2) 后再将当前得到的第3个数与第5个数比较,若比第5个数,则二者交换位置;
  • 【从而使得:第3个数是倒数第3小的数
  • 4、 除去前3个数,将当前的第4个数作为“当前数”,将其与右边1个数作比较:
    • (1) 将当前的第4个数与第5个数比较,若比第5个数,则二者交换位置。
  • 【从而使得:第4个数是倒数第4小的数;由此,第5个数成为了最大的数。】

三、总结 🎀:

  • 上面的 1、 2、 3、 4、 相当于第一层循环(循环4次=总个数-1,i=0,1,2,3);里面的各小点 (1) (2) (3) (4) 表示第二层循环(循环4-i次,即5-(i+1)次=总个数-“当前数”=“当前数”右边的总个数)。

四、注意 💐:如下代码里的 4=数组总长度-15=数组总长度,其实可以直接用数组总长度进行替换,我这里之所以写成数字,只是为了方便逻辑解释哦~

/**
 * 需求:将 83, 96, 72, 35, 24 五个数使用选择法实现升序(由小到大排序)。
 */
#include <stdio.h>
int main()
{
    /** 使用变量/常量前必须先声明 */
    int a[5] = {83, 96, 72, 35, 24}; // 声明一个含5个整数的数组a
    int i, j, t;                     // i:第一层循环里-数组元素的索引值 j:第二层循环里-数组元素的索引值 t:交换数组元素位置的中间变量

    /** 使用选择法实现升序:从左到右,除最后一个数依次作为“当前数”与其右边所有数分别比较:若比右边数大,则与该右边数交换位置;否则不交换位置 */
    // 第一层循环:循环4(=数组a长度-1)次(因为最后一个数的右边没有值了,所以“当前数”为最后一个数时 不用再循环一次了。虽然这儿的4替换成>=4的任何数 对结果无影响(因为第二层循环做了限制),但为了避免不必要的循环,这里最好写4)
    for (i = 0; i < 4; i++) // 因为第一个数组元素的索引值为0,所以i的初始值为0;因为循环4次,所有循环执行条件是: i<4;i++:每次循环一次后i加1
        // 第二层循环:循环5-(i+1)次(=“当前数”右边所有数的总个数)
        for (j = i + 1; j < 5; j++) // 因为与“当前数”比较的第一个数值是 索引值为i的数组元素(“当前数”) 右边的第一个,所有j的初始值是i+1;因为循环5-(i+1)次,所以循环执行条件是: i<5;j++:每次循环一次后j加1
            // 第二层循环的循环体:若“当前数”>与其比较的数,就交换位置
            if (a[i] > a[j])
            {
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }

    /** 输出结果 */
    printf("最终结果为:\n"); // 提示信息
    for (i = 0; i < 5; i++)
        printf("%d\t", a[i]); // for循环依次输出最终数组里的值
    printf("\n");             // 注意:这里必须单独提一个输出语句来输出换行符(\n),不然末尾默认会被加上符号“%”

    /** 程序正常运行结束 */
    return 0;
}

在这里插入图片描述

(三)、举例二

需求:输入10个地区的面积(面积为整数),使用选择法对它们由小到大排序并输出排序后的结果。

/**
 * 需求:输入10个地区的面积(面积为整数),使用选择法对它们由小到大排序并输出排序后的结果。
 */
#include <stdio.h>
int main()
{
    /** 使用变量/常量前必须先声明 */
    int a[10]; // 声明一个包含10个整数的数组a
    int i, j, t;

    /** 引导用户输入10个面积 */
    printf("请输入10个面积:\n"); // 提示信息
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]); // 用户输入,并将输入结果依次赋值给数组a里的各数组元素

    /** 使用选择法实现升序 */
    // 第一层循环(循环9次)
    for (i = 0; i < 9; i++)
        // 第二层循环(循环10-(i+1)次)
        for (j = i + 1; j < 10; j++)
            // 第二层循环的循环体
            if (a[i] > a[j])
            {
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }

    /** 输出结果 */
    printf("排序后的面积依次是:\n"); // 提示信息
    for (i = 0; i < 10; i++)
        printf("%d\t", a[i]); // 依次输出
    printf("\n");             // 注意:这里必须单独提一个输出语句来输出换行符(\n),不然末尾默认会被加上符号“%”

    /** 程序正常运行结束 */
    return 0;
}

在这里插入图片描述

二、选择法 —— 降序 ⭐️

在这里插入图片描述

(一)、思路

从左到右,除最后一个数 依次作为 “当前数”其右边所有数 分别比较:

  • 若比右边数,则与该右边数交换位置;否则不交换位置(因为降序是由大到小排序滴)。

(二)、举例

一、需求 🌈:将 83, 96, 72, 35, 24 五个数使用选择法实现降序(由大到小排序)。

二、实现思路 📚:(从左往右 👉🏻)

  • 1、第1个数作为“当前数”,将其与右边四个数作比较:
    • (1) 先将第1个数与第2个数比较,若比第2个数,则二者交换位置;
    • (2) 后再将当前得到的第1个数与第3个数比较,若比第3个数,则二者交换位置;
    • (3) 后再将当前得到的第1个数与第4个数比较,若比第4个数,则二者交换位置;
    • (4) 后再将当前得到的第1个数与第5个数比较,若比第5个数,则二者交换位置;
  • 【从而使得:第1个数是最大数
  • 2、 除去第1个数,将当前的第2个数作为“当前数”,将其与右边3个数作比较:
    • (1) 先将当前的第2个数与第3个数比较,若比第3个数,则二者交换位置;
    • (2) 后再将当前得到的第2个数与第4个数比较,若比第4个数,则二者交换位置;
    • (3) 后再将当前得到的第2个数与第5个数比较,若比第5个数,则二者交换位置;
  • 【从而使得:第2个数是倒数第2大的数
  • 3、 除去前2个数,将当前的第3个数作为“当前数”,将其与右边2个数作比较:
    • (1) 先将当前的第3个数与第4个数比较,若比第4个数,则二者交换位置;
    • (2) 后再将当前得到的第3个数与第5个数比较,若比第5个数,则二者交换位置;
  • 【从而使得:第3个数是倒数第3大的数
  • 4、 除去前3个数,将当前的第4个数作为“当前数”,将其与右边1个数作比较:
    • (1) 将当前的第4个数与第5个数比较,若比第5个数,则二者交换位置。
  • 【从而使得:第4个数是倒数第4大的数;由此,第5个数成为了最小的数。】

三、总结 🎀:

  • 上面的 1、 2、 3、 4、 相当于第一层循环(循环4次=总个数-1,i=0,1,2,3);里面的各小点 (1) (2) (3) (4) 表示第二层循环(循环4-i次,即5-(i+1)次=总个数-“当前数”=“当前数”右边的总个数)。

三、注意 💐:如下代码里的 4=数组总长度-15=数组总长度,其实可以直接用数组总长度进行替换,我这里之所以写成数字,只是为了方便逻辑解释哦~

/**
 * 需求:将 83, 96, 72, 35, 24 五个数使用选择法实现降序(由大到小排序)。
 */
#include <stdio.h>
int main()
{
    /** 使用变量/常量前必须先声明 */
    int a[5] = {83, 96, 72, 35, 24}; // 声明一个含5个整数的数组a
    int i, j, t;                     // i:第一层循环里-数组元素的索引值 j:第二层循环里-数组元素的索引值 t:交换数组元素位置的中间变量

    /** 使用选择法实现降序:从左到右,除最后一个数依次作为“当前数”与其右边所有数分别比较:若比右边数小,则与该右边数交换位置;否则不交换位置 */
    // 第一层循环:循环4(=数组a长度-1)次(因为最后一个数的右边没有值了,所以“当前数”为最后一个数时 不用再循环一次了。虽然这儿的4替换成>=4的任何数 对结果无影响(因为第二层循环做了限制),但为了避免不必要的循环,这里最好写4)
    for (i = 0; i < 4; i++) // 因为第一个数组元素的索引值为0,所以i的初始值为0;因为循环4次,所有循环执行条件是: i<4;i++:每次循环一次后i加1
        // 第二层循环:循环5-(i+1)次(=“当前数”右边所有数的总个数)
        for (j = i + 1; j < 5; j++) // 因为与“当前数”比较的第一个数值是 索引值为i的数组元素(“当前数”) 右边的第一个,所有j的初始值是i+1;因为循环5-(i+1)次,所以循环执行条件是: i<5;j++:每次循环一次后j加1
            // 第二层循环的循环体:若“当前数”<与其比较的数,就交换位置,从而实现降序
            if (a[i] < a[j])
            {
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }

    /** 输出结果 */
    printf("最终结果为:\n"); // 提示信息
    for (i = 0; i < 5; i++)
        printf("%d\t", a[i]); // for循环依次输出最终数组里的值
    printf("\n");             // 注意:这里必须单独提一个输出语句来输出换行符(\n),不然末尾默认会被加上符号“%”

    /** 程序正常运行结束 */
    return 0;
}

在这里插入图片描述

三、总结 ⭐️

在这里插入图片描述

如下是我自己通过反复敲代码验证,画出的构图和梳理的归纳总结🌈,如若有幸可以帮到各位小可爱,我会很开心滴哦;如若有小可爱发现错误,也欢迎评论区指证一下哦,谢谢啦~ 💐

在这里插入图片描述

这篇笔记主要是为了对升序降序的处理思维做一个梳理,代码可能没那么多高端操作,嘿嘿~

下一篇:C/C++ 实现升序降序(冒泡法/沉底法)

在这里插入图片描述

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小呀小萝卜儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值