为何Python自定义无sorted函数的排序代码结果与预期相反?
为什么交换条件的符号会改变排序方向?
让我一步步拆解你的代码逻辑,帮你搞明白问题所在~
首先,先看你的核心逻辑:通过两层循环遍历列表的每一对元素,只要满足lista[l] < lista[i]的条件,就交换这两个元素的位置。我们用一个小例子来模拟运行过程,就能清楚看到符号的影响了。
原代码(用<)的运行逻辑
假设初始列表是[3,1,2],走一遍流程:
- i=0(对应元素3):
- 跳过l=0,依次比较l=1和l=2:
- l=1:
1 < 3成立,交换后列表变成[1,3,2] - l=2:此时i位置的元素是1,
2 < 1不成立,不交换
- l=1:
- 跳过l=0,依次比较l=1和l=2:
- i=1(对应元素3):
- 跳过l=1,依次比较l=0和l=2:
- l=0:
1 < 3成立,交换后列表变成[3,1,2] - l=2:
2 < 3成立,交换后列表变成[3,2,1]
- l=0:
- 跳过l=1,依次比较l=0和l=2:
- i=2(对应元素1):
- 所有l位置的元素都不小于1,没有交换
最终得到[3,2,1],是降序。原因很简单:当你判断lista[l] < lista[i]时,本质是在说「如果l位置的元素比i位置的小,就把这两个元素交换」——这会把大的元素不断往列表的前面推,最终大的元素都聚在开头,形成降序。
修改条件为>后的运行逻辑
同样用初始列表[3,1,2]:
- i=0(对应元素3):
- 所有l位置的元素都不大于3,没有交换,列表保持
[3,1,2]
- 所有l位置的元素都不大于3,没有交换,列表保持
- i=1(对应元素1):
- 跳过l=1,比较l=0:
3 > 1成立,交换后列表变成[1,3,2] - l=2的元素2不大于3,不交换
- 跳过l=1,比较l=0:
- i=2(对应元素2):
- 跳过l=2,比较l=1:
3 > 2成立,交换后列表变成[1,2,3]
- 跳过l=2,比较l=1:
最终得到[1,2,3],是升序。这时候的逻辑是「如果l位置的元素比i位置的大,就交换」——这会把大的元素不断往列表的后面推,小的元素留在前面,自然形成升序。
额外补充
你的算法和常规的冒泡/选择排序不太一样,它会让每个元素和所有其他元素都比较一遍,效率相对低一些,但核心的交换条件直接决定了元素的移动方向:
- 想让大元素往前跑(降序):用
<判断小元素,交换后大元素移到前面 - 想让大元素往后跑(升序):用
>判断大元素,交换后大元素移到后面
内容的提问来源于stack exchange,提问作者user1898662
相关产品推荐
相关产品推荐

