You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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的随机列表,当前桶排序逻辑没有适配元素最大值大于数组长度的场景,仅靠调整随机数范围无法通用。

修复方案

  1. 若仅要快速修复当前demo的报错,可调整随机数生成范围:如果要生成0到数组长度-1的元素,修改为random.randint(0, nElementos - 1)即可
  2. 通用优化方案:调整桶排序逻辑,先取数组的最大值确定桶的数量,适配所有整数排序场景,支持你后续测试不同长度的随机列表

修复后完整可运行代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:18:03