如何解决Python桶排序代码出现的IndexError: list index out of range错误
错误根因
- 随机数生成逻辑取值越界:你调用
random.randint(0, nElementos)生成数组元素,该方法返回值包含上下界,会生成等于nElementos的元素 - 桶的数量不足:桶排序初始化时仅创建了
len(array)个桶,下标范围是0 ~ len(array)-1,如果元素值等于nElementos(也就是等于数组长度),访问bucket[index_b]时就会触发下标越界。单次运行没报错只是因为刚好没随机到边界值,多次运行必然触发错误。 - 适配不同长度列表的逻辑缺失:你后续需要处理长度5、10、100、1000、10000的随机列表,当前桶排序逻辑没有适配元素最大值大于数组长度的场景,仅靠调整随机数范围无法通用。
修复方案
- 若仅要快速修复当前demo的报错,可调整随机数生成范围:如果要生成0到数组长度-1的元素,修改为
random.randint(0, nElementos - 1)即可 - 通用优化方案:调整桶排序逻辑,先取数组的最大值确定桶的数量,适配所有整数排序场景,支持你后续测试不同长度的随机列表
修复后完整可运行代码
import random def bucketSort(array): if not array: return array # 先取数组最大值确定桶数量,避免下标越界 max_val = max(array) bucket = [[] for _ in range(max_val + 1)] # 元素入桶 for j in array: bucket[j].append(j) # 单桶排序+合并结果 sorted_array = [] for b in bucket: sorted_array.extend(sorted(b)) return sorted_array # 测试需求指定的不同长度随机列表 test_lengths = [5,10,100,1000,10000] for length in test_lengths: array = [random.randint(0, length) for _ in range(length)] print(f"===== 测试列表长度:{length} =====") # 长度超过100的数组只打印首尾元素避免输出过长 if length <= 100: print("原数组:", array) else: print(f"原数组前10个元素:{array[:10]},后10个元素:{array[-10:]}") sorted_arr = bucketSort(array) print("排序后数组:", end="") if length <= 100: print(sorted_arr) else: print(f"前10个元素:{sorted_arr[:10]},后10个元素:{sorted_arr[-10:]}") # 校验排序结果正确性 assert sorted_arr == sorted(array), "排序结果错误" print("排序校验通过\n")
内容的提问来源于stack exchange,提问作者Carlos Chagas Junior
相关产品推荐
相关产品推荐

