Python自定义列表排序函数报IndexError:如何修复并实现升序排序
问题分析与修复方案
1. 索引越界错误原因
循环for j in range(len(num))会让j取到len(num)-1,此时j+1等于len(num),超出了列表的最大索引(列表索引从0开始,最大索引为len(num)-1),因此触发IndexError。
2. 返回值错误
函数最后return my_list是返回函数对象本身,而非排序后的列表,应该返回处理后的num。
3. 优化冒泡排序循环次数
原代码的rep=len(num)//2+1不是标准冒泡排序的合理循环次数,冒泡排序只需循环len(num)-1次——每一轮都会把当前最大的元素“冒”到列表末尾,后续轮次无需再比较已排好序的末尾元素。
修复后的完整代码
def my_list(num): # 冒泡排序最多需要 len(num)-1 轮循环 for i in range(len(num)-1): # 每轮只需比较到未排序的最后一个元素,减少重复比较 for j in range(len(num)-1 - i): if num[j] > num[j+1]: # 交换两个元素位置 temp = num[j] num[j] = num[j+1] num[j+1] = temp # 返回排序后的列表 return num x = my_list([1,10,5,7]) print(x) # 输出: [1, 5, 7, 10]
代码说明
- 外层循环
range(len(num)-1):确保所有元素完成排序,最多需要n-1轮(n为列表长度)。 - 内层循环
range(len(num)-1 -i):每完成一轮,末尾i个元素已处于有序状态,无需重复比较,提升效率。 - 元素交换:通过临时变量
temp完成两个元素的位置互换,实现升序排序。 - 返回值修正:改为返回排序后的列表
num,而非函数对象。
内容的提问来源于stack exchange,提问作者Exare
相关产品推荐
相关产品推荐

