c#实现桶排序算法
c# implementing a bucket sort algorithm
大家晚上好!我创建了一个桶排序算法,但它抛出一个错误,指出索引超出范围。你能告诉我问题出在哪里吗?我自己找不到解决办法,所以才寻求你的帮助
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);
}
}
在我回答之前,我想强烈建议您在寻求外界帮助之前始终先真诚地尝试解决问题。我不一定认为你没有尝试过,但这个问题很容易通过调试器来识别。
如果这是您不太熟悉的编码方面,我强烈建议您优先学习它 - 从长远来看,它只会让您成为更好的开发人员 运行。
此时 Scatter
方法出现问题:
int bucketNumber = GetBucketNumber(value);
buckets[bucketNumber].Add(value);
异常发生是因为 GetBucketNumber
将输入乘以 10,但您使用该乘积作为 buckets
的索引。
我不确定你对它进行排序的逻辑是什么,但我知道你为什么会收到索引超出范围的错误。
代码错误
您正在创建 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;
}
你必须做
在寻求帮助之前,尝试通过艰苦的尝试来解决您的问题。 运行 首先在纸上编写程序我的意思是在开始编码之前确认您的逻辑。对您有信心,并为您的尝试留出足够的时间。享受编码。
大家晚上好!我创建了一个桶排序算法,但它抛出一个错误,指出索引超出范围。你能告诉我问题出在哪里吗?我自己找不到解决办法,所以才寻求你的帮助
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);
}
}
在我回答之前,我想强烈建议您在寻求外界帮助之前始终先真诚地尝试解决问题。我不一定认为你没有尝试过,但这个问题很容易通过调试器来识别。
如果这是您不太熟悉的编码方面,我强烈建议您优先学习它 - 从长远来看,它只会让您成为更好的开发人员 运行。
此时 Scatter
方法出现问题:
int bucketNumber = GetBucketNumber(value);
buckets[bucketNumber].Add(value);
异常发生是因为 GetBucketNumber
将输入乘以 10,但您使用该乘积作为 buckets
的索引。
我不确定你对它进行排序的逻辑是什么,但我知道你为什么会收到索引超出范围的错误。
代码错误
您正在创建 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;
}
你必须做
在寻求帮助之前,尝试通过艰苦的尝试来解决您的问题。 运行 首先在纸上编写程序我的意思是在开始编码之前确认您的逻辑。对您有信心,并为您的尝试留出足够的时间。享受编码。