排序逻辑与赋值运算符
排序逻辑与赋值运算符
背景
今天上课做题的时候碰见一个有趣的题目,关于怎么排序
这是题干:
1 | |
根本不会写,后来问了豆包,我写的代码:
1 | |
排序逻辑
核心是通过“两两比较、交换位置”的方式,把最小的放到最前面,中间的放中间,最大的放最后。
以输入的三个字符 a、b、c 为例,我们的目标是让 a ≤ b ≤ c (这里的“≤”是按字符的ASCII码比较)。
第一步:确保 a 是 a 和 b 中较小的
比如输入的 a=’r’ 、 b=’d’ :
- 因为 ‘r’ > ‘d’ ,所以交换 a 和 b ,交换后 a=’d’ 、 b=’r’ 。
- 这一步完成后, a 一定是 a、b 里更小的那个。
第二步:确保 a 是三个字符中最小的
经过第一步, a 已经是 a、b 里最小的了,但还要和 c 比:
比如现在 a=’d’ 、 c=’k’ :
- 因为 ‘d’ < ‘k’ ,不需要交换;
如果 c 更小(比如 c=’a’ ),就交换 a 和 c ,让 a 变成最小的。 - 这一步完成后, a 一定是三个字符中最小的那个。
第三步:确保 b 是剩下两个里较小的
经过前两步, a 已经是最小的了,现在只需要比较 b 和 c :
比如现在 b=’r’ 、 c=’k’ :
- 因为 ‘r’ > ‘k’ ,交换 b 和 c ,交换后 b=’k’ 、 c=’r’ 。
- 这一步完成后, b 一定是 b、c 里更小的,而 a 已经是最小的,所以最终 a ≤ b ≤ c 。
举个具体例子(对应题目输入 dnk )
输入的三个字符是 a=’d’ 、 b=’n’ 、 c=’k’ :
- 第一步:比较 a 和 b ( ‘d’ < ‘n’ )→ 不用交换, a=’d’ 、 b=’n’ ;
- 第二步:比较 a 和 c ( ‘d’ < ‘k’ )→ 不用交换, a 还是最小的;
- 第三步:比较 b 和 c ( ‘n’ > ‘k’ )→ 交换 b 和 c ,交换后 b=’k’ 、 c=’n’ ;
最终结果就是 a=’d’ 、 b=’k’ 、 c=’n’ ,输出 d k n (和题目示例一致)。
总结
这个逻辑的本质是:
- 先把最小的字符“挑出来”放到 a 的位置;
- 再把剩下两个里较小的放到 b 的位置;
- 最后剩下的 c 自然是最大的。
相当于“先定最小的,再定中间的,最后定最大的”,是不是更清楚啦~
定义temp变量在这里的作用
要理解 temp 的作用,首先得明确“交换两个变量的值”的逻辑——需要一个“临时容器”来暂存数据,避免交换时数据被覆盖丢失。
- temp 的含义
temp 是一个临时变量( temp 是“temporary(临时)”的缩写),用来临时存储字符的值,辅助完成两个字符变量的交换。
- 交换的实现过程(以 if (a > b) 的交换为例)
假设输入的 a=’d’ 、 b=’n’ (实际是字符对应的ASCII码值比较, ‘d’ 的ASCII是100, ‘n’ 是110,所以 a > b 不成立;这里举个反例,比如 a=’n’ 、 b=’d’ ,此时 a > b 成立):
- 初始状态: a=’n’ , b=’d’
- 第一步: temp = a; → 把 a 的值( ‘n’ )暂存到 temp 里,此时 temp=’n’
- 第二步: a = b; → 把 b 的值( ‘d’ )赋值给 a ,此时 a=’d’
- 第三步: b = temp; → 把 temp 里暂存的 ‘n’ 赋值给 b ,此时 b=’n’
最终 a=’d’ 、 b=’n’ ,完成了 a 和 b 的交换,实现了 a ≤ b 。
- 整个排序中 temp 的作用
代码里的3次 if 判断,都是通过 temp 做“临时容器”,依次保证:
- 第一次 if : a ≤ b
- 第二次 if : a ≤ c (此时 a 已经是前两个里最小的,再和 c 比较,确保 a 是三个里最小的)
- 第三次 if : b ≤ c (此时 a 是最小的,再调整 b 和 c 的顺序,最终 a ≤ b ≤ c )
简单说: temp 就像一个“中转站”,在交换两个变量时,先把其中一个值存起来,避免交换过程中数据被覆盖,从而完成两个变量的数值互换。
注意
在C语言中,赋值运算符 = 的逻辑是“把右边的值,赋给左边的变量”,核心是“右值给左变量”,所以等号两边的位置绝对不能交换,交换后逻辑会完全改变(甚至报错)。
具体逻辑关系:
- 等号左边:必须是一个“可被赋值的变量”(也叫“左值”,是内存中有明确存储地址的容器)。
- 等号右边:可以是“变量、常量、表达式”(也叫“右值”,是一个具体的数值/结果)。
C语言的 = 是“右→左”的赋值方向,右边是“数据源”,左边是“数据的存储目标”,位置一旦颠倒,逻辑就会错误。