【发布时间】: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 才能获得可以放置元素的索引。你能指导我吗?
【问题讨论】: