c#实现一个桶排序算法

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


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

            }

        }


慕莱坞森
浏览 188回答 2
2回答

慕的地6264312

我不确定你为排序做了什么逻辑,但我知道你为什么索引超出范围错误。代码错误您正在创建 10 个存储桶,现在您正在尝试通过将当前值或数组乘以 10 来生成存储桶编号。例如,如果您当前的数组值为 2,则生成的存储桶编号将为 20。您只有 10 个存储桶,因此Scatter()方法会给您错误。&nbsp;private static void Scatter(int[] array, List<List<int>> buckets)&nbsp;{&nbsp; &nbsp; &nbsp;foreach (int value in array)&nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int bucketNumber = GetBucketNumber(value);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;buckets[bucketNumber].Add(value); // ERROR HERE&nbsp; &nbsp; &nbsp;}&nbsp;}解决方案其实GetBucketNumber()方法有问题。您应该使用余数而不是乘法。更改方法如下。private static int GetBucketNumber(int value){&nbsp; &nbsp; int val = value % 10;&nbsp; &nbsp; return val;}你必须做在寻求帮助之前,请尝试通过艰苦的尝试来解决您的问题。首先在纸上运行你的程序我的意思是在你开始编码之前确认你的逻辑。相信你,并给你足够的时间去尝试。享受编码。

qq_花开花谢_0

在我回答之前,我想强烈建议您在寻求外部帮助之前始终先真诚地尝试解决问题。我不一定认为您没有尝试过,但是通过逐步调试调试器可以轻松识别此问题。如果这是您不太熟悉的编码方面,我强烈建议将其作为学习的优先事项 - 从长远来看,它只会使您成为更好的开发人员。此时方法中出现问题Scatter:int bucketNumber = GetBucketNumber(value); buckets[bucketNumber].Add(value);发生异常是因为GetBucketNumber将输入乘以 10,但您使用的是乘以的值作为 的索引buckets。
打开App,查看更多内容
随时随地看视频慕课网APP