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;
}

你必须做

在寻求帮助之前,尝试通过艰苦的尝试来解决您的问题。 运行 首先在纸上编写程序我的意思是在开始编码之前确认您的逻辑。对您有信心,并为您的尝试留出足够的时间。享受编码。