求解析这段Python列表降序排序代码的执行逻辑
解析Python排序代码的执行逻辑
先看完整代码:
llist = [5, 2, 1, 4, 3] for i in range(len(llist)): for j in range(i+1): if llist[j] < llist[i]: temp = llist[i] llist[i] = llist[j] llist[j] = temp print(llist)
这段代码是降序排序的变体实现,核心逻辑是:每一轮外层i循环中,把当前i位置的元素,和它前面所有已处理过的元素(从0到i)逐一比较,如果前面的元素更小,就交换两者位置。最终每一轮结束后,前i+1个元素会保持从大到小的顺序。
下面逐轮拆解执行过程:
初始状态
列表:[5, 2, 1, 4, 3]
第1轮:i = 0
外层循环i取0,内层j循环范围是range(0+1)即[0],只执行1次:
j=0:比较llist[0](5)和自身,5 < 5不成立,不交换。
列表无变化:[5, 2, 1, 4, 3]
第2轮:i = 1
外层i取1,内层j循环范围是range(1+1)即[0,1]:
j=0:比较llist[0](5)和llist[1](2),5 < 2不成立,不交换。j=1:比较自身,无交换。
列表无变化:[5, 2, 1, 4, 3]
第3轮:i = 2
外层i取2,内层j循环范围是range(2+1)即[0,1,2]:
j=0:llist[0](5)和llist[2](1),5 < 1不成立,不交换。j=1:llist[1](2)和llist[2](1),2 < 1不成立,不交换。j=2:比较自身,无交换。
列表无变化:[5, 2, 1, 4, 3]
第4轮:i = 3
外层i取3,对应元素是llist[3] = 4,内层j循环范围是range(3+1)即[0,1,2,3]:
j=0:llist[0](5)和4,5 < 4不成立,不交换。j=1:llist[1](2)和4,2 < 4成立,执行交换:temp = 4,llist[3] = 2,llist[1] = 4
列表变为:[5, 4, 1, 2, 3]
j=2:此时llist[i]是2,llist[2]是1,1 < 2成立,执行交换:temp = 2,llist[3] = 1,llist[2] = 2
列表变为:[5, 4, 2, 1, 3]
j=3:比较自身,无交换。
本轮结束后列表:[5, 4, 2, 1, 3]
第5轮:i = 4
外层i取4,对应元素是llist[4] = 3,内层j循环范围是range(4+1)即[0,1,2,3,4]:
j=0:llist[0](5)和3,5 < 3不成立,不交换。j=1:llist[1](4)和3,4 < 3不成立,不交换。j=2:llist[2](2)和3,2 < 3成立,执行交换:temp = 3,llist[4] = 2,llist[2] = 3
列表变为:[5, 4, 3, 1, 2]
j=3:此时llist[i]是2,llist[3]是1,1 < 2成立,执行交换:temp = 2,llist[4] = 1,llist[3] = 2
列表变为:[5, 4, 3, 2, 1]
j=4:比较自身,无交换。
最终结果
循环结束后,列表变为[5, 4, 3, 2, 1],也就是降序排列。
简单总结:每一轮i循环都会把当前i位置的元素,向前“插入”到前面已排序的降序列表中正确的位置——只要前面有比它小的元素,就交换位置,直到前面的元素都比它大,或者到列表开头。
内容的提问来源于stack exchange,提问作者Tommaso Maganzani
相关产品推荐
相关产品推荐

