首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#实现桶排序算法

c#实现桶排序算法
EN

Stack Overflow用户
提问于 2018-05-25 03:13:16
回答 2查看 784关注 0票数 3

大家晚上好!我创建了一个桶排序算法,但是它抛出了一个索引超出范围的错误。你能告诉我哪里有问题吗?我一个人找不到解决办法,所以我找你帮忙

代码语言:javascript
复制
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);
            }
        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-25 03:47:16

我不知道您对此进行排序的逻辑是什么,但我理解了为什么要使索引超出范围误差。

代码中的错误

您正在创建10个桶,现在您正试图通过将当前值或数组乘以10来生成桶号。

例如,如果数组的当前值为2,则生成的桶号为20,只有10个桶,因此Scatter()方法会给出错误。

代码语言:javascript
复制
 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()方法存在问题。你应该使用余数,而不是乘法。使用以下方法更改方法。

代码语言:javascript
复制
private static int GetBucketNumber(int value)
{
    int val = value % 10;
    return val;
}

你必须做

在寻求帮助之前,试着努力解决你的问题。首先在纸上运行你的程序,我的意思是在你开始编码之前确认你的逻辑。对你有信心,给你足够的时间去尝试。享受编码吧。

票数 2
EN

Stack Overflow用户

发布于 2018-05-25 03:43:37

在我回答之前,我强烈建议你在寻求外部帮助之前,总是真诚地尝试先解决一个问题。我不一定认为您没有尝试,但是这个问题很容易通过调试器来识别。

如果这是你不太熟悉的编码的一个方面,我强烈建议把它作为学习的优先事项--从长远来看,它只会使你成为一个更好的开发人员。

此时,在Scatter方法中出现了问题:

int bucketNumber = GetBucketNumber(value); buckets[bucketNumber].Add(value);

出现此异常是因为GetBucketNumber将输入乘以10,但您使用该乘数值作为buckets的索引。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50520968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档