大家晚上好!我创建了一个桶排序算法,但是它抛出了一个索引超出范围的错误。你能告诉我哪里有问题吗?我一个人找不到解决办法,所以我找你帮忙
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);
}
}发布于 2018-05-25 03:47:16
我不知道您对此进行排序的逻辑是什么,但我理解了为什么要使索引超出范围误差。
代码中的错误
您正在创建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;
}你必须做
在寻求帮助之前,试着努力解决你的问题。首先在纸上运行你的程序,我的意思是在你开始编码之前确认你的逻辑。对你有信心,给你足够的时间去尝试。享受编码吧。
发布于 2018-05-25 03:43:37
在我回答之前,我强烈建议你在寻求外部帮助之前,总是真诚地尝试先解决一个问题。我不一定认为您没有尝试,但是这个问题很容易通过调试器来识别。
如果这是你不太熟悉的编码的一个方面,我强烈建议把它作为学习的优先事项--从长远来看,它只会使你成为一个更好的开发人员。
此时,在Scatter方法中出现了问题:
int bucketNumber = GetBucketNumber(value); buckets[bucketNumber].Add(value);
出现此异常是因为GetBucketNumber将输入乘以10,但您使用该乘数值作为buckets的索引。
https://stackoverflow.com/questions/50520968
复制相似问题