c#实现桶排序算法

时间:2018-05-25 03:13:17

标签: c# sorting bucket-sort

大家晚上好!我创建了一个桶排序算法,但它抛出了一个索引超出范围的错误。你能告诉我问题在哪里吗?我无法自己找到解决方案,这就是我寻求帮助的原因

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

2 个答案:

答案 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的索引。