合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻
一、选择法 —— 升序 ⭐️
(一)、思路
从左到右,除最后一个数 依次作为 “当前数” 与 其右边所有数 分别比较:
- 若比右边数
大
,则与该右边数交换位置
;否则不交换位置(因为升序是由小到大
排序滴)。
(二)、举例一
需求:将
83
,96
,72
,35
,24
五个数使用选择法
实现升序(由小到大排序)。
注意:如下代码里的
4
=数组总长度-1
、5
=数组总长度
,其实可以直接用数组总长度
进行替换,我这里之所以写成数字,只是为了方便逻辑解释哦~
/**
* 需求:将 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
五个数使用选择法
实现降序(由大到小排序)。
注意:如下代码里的
4
=数组总长度-1
、5
=数组总长度
,其实可以直接用数组总长度
进行替换,我这里之所以写成数字,只是为了方便逻辑解释哦~
/**
* 需求:将 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;
}
三、总结 ⭐️
如下是我自己通过反复敲代码验证,画出的构图和梳理的归纳总结🌈,如若有幸可以帮到各位小可爱,我会很开心滴哦;如若有小可爱发现错误,也欢迎评论区指证一下哦,谢谢啦~ 💐
这篇笔记主要是为了对
升序降序的处理思维
做一个梳理,代码可能没那么多高端操作,嘿嘿~