大家晚上好!我创建了一个桶排序算法,但它抛出了一个索引超出范围的错误。你能告诉我问题在哪里吗?我无法自己找到解决方案,这就是我寻求帮助的原因
public int[] Sort(int[] unsortedSequence)
{
List<List<int>> buckets = new List<List<int>>();
InitializeBuckets(buckets);
Scatter(unsortedSequence, buckets);
int i = 0;
foreach (List<int> bucket in buckets)
{
int[] arr = bucket.ToArray();
InsertionSort(arr);
foreach (int d in arr)
{
unsortedSequence[i++] = d;
}
}
return unsortedSequence;
}
private static void Scatter(int[] array, List<List<int>> buckets)
{
foreach (int value in array)
{
int bucketNumber = GetBucketNumber(value);
buckets[bucketNumber].Add(value);
}
}
private static void InsertionSort(int[] array)
{
int j;
int temp;
for (int i = 1; i < array.Length; i++)
{
j = i;
while (j > 0 && array[j] < array[j - 1])
{
temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
j--;
}
}
}
private static int GetBucketNumber(int value)
{
int val = value * 10;
return val;
}
private static void InitializeBuckets(List<List<int>> buckets)
{
for (int i = 0; i < 10; i++)
{
List<int> a = new List<int>();
buckets.Add(a);
}
}
答案 0 :(得分:2)
我不确定你为排序这个做了什么逻辑,但我知道为什么你的索引超出范围错误。
代码错误
您正在创建10个存储桶,现在您尝试通过将当前值或数组乘以10来生成存储桶编号。
例如,如果您当前的数组值为2,则生成的存储桶编号为20.您只有10个存储桶,因此Scatter()
方法会给您错误。
private static void Scatter(int[] array, List<List<int>> buckets)
{
foreach (int value in array)
{
int bucketNumber = GetBucketNumber(value);
buckets[bucketNumber].Add(value); // ERROR HERE
}
}
<强>解强>
实际上,GetBucketNumber()
方法存在问题。你应该使用余数而不是乘法。改变方法如下。
private static int GetBucketNumber(int value)
{
int val = value % 10;
return val;
}
你必须
在您寻求帮助之前尝试通过艰难尝试解决您的问题。首先在纸上运行您的程序我的意思是在开始编码之前确认您的逻辑。相信你,给你足够的时间尝试。享受编码。
答案 1 :(得分:1)
在我回答之前,我想强烈建议您在寻求外界帮助之前,始终善意地尝试解决问题。我不一定认为你没有尝试过,但通过调试器很容易识别出这个问题。
如果这是编码的一个方面,你不太熟悉,我强烈建议把它作为学习的优先考虑 - 从长远来看,它只会让你成为一个更好的开发者。
此时Scatter
方法出现了问题:
int bucketNumber = GetBucketNumber(value);
buckets[bucketNumber].Add(value);
发生异常是因为GetBucketNumber
将输入乘以10,但您使用该乘积值作为buckets
的索引。