【问题标题】:Index Out Of Range Bucket Sort索引超出范围桶排序
【发布时间】:2022-01-10 12:13:24
【问题描述】:

所以我编写了桶排序实现(我使用rnd.NextDouble() 来填充我的数组,所以所有元素都在 0 和 1 之间的范围内)。而且我有许多实验(每个数组大小 10 个实验)和不同的数组大小(我从 1000 开始,然后 +1000,等等,直到 300.000)。有时它可以正常工作,但有时它会给我 OutOfRange 异常:

public static void BucketSortImplement(ref int countOfElements, ref float[] array)
{
    List<float>[] buckets = new List<float>[countOfElements];

    for (int i = 0; i < countOfElements; i++)
    {
        buckets[i] = new List<float>();
    }

    for (int i = 0; i < countOfElements; i++)
    {
        float indexOfElement = array[i] * countOfElements;
        buckets[(int)indexOfElement].Add(array[i]);       // right here
    }

    for (int i = 0; i < countOfElements; i++)
    {
        for (int j = 0; j < buckets[i].Count; j++)
        {
            float keyElement = buckets[i][j];
            int k = j - 1;

            while (k >= 0 && buckets[i][k] > keyElement)
            {
                buckets[i][k + 1] = buckets[i][k];
                k -= 1;
            }

            buckets[i][k + 1] = keyElement;
        }
    }

    int arrayIndex = 0;

    for (int i = 0; i < countOfElements; i++)
    {
        for (int j = 0; j < buckets[i].Count; j++)
        {
            array[arrayIndex++] = buckets[i][j];
        }
    }
}

我有点困惑,因为算法本身看起来不错,也就是说我必须计算 array[i] * countOfElements 才能获得可以放置元素的索引。你能指导我吗?

【问题讨论】:

    标签: c# sorting


    【解决方案1】:

    如果您的数组包含值“1”,它将导致 OutOfRange,因为如果您的列表大小等于 3(例如),那么有效索引将在 [0, 2] 范围内。

    【讨论】:

    • NextDouble() 返回一个大于等于 0.0 且小于 1.0 的随机浮点数。
    • NextDouble 的最大值为 0.99999999999999978。如果您将其转换为浮动,您将获得 1.0。
    • 这很有趣,我今天学到了别的东西。
    • @SergeyMiryanov 哇,非常感谢!这解决了我的问题)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 2016-03-31
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多