为了账号安全,请及时绑定邮箱和手机立即绑定

c#实现一个桶排序算法

c#实现一个桶排序算法

C#
慕莱坞森 2021-06-27 14:02:26
大家晚上好!我创建了一个桶排序算法,但它给我一个索引超出范围的错误。你能告诉我问题出在哪里吗?我自己找不到解决方案,这就是我寻求您的帮助的原因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 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

我不确定你为排序做了什么逻辑,但我知道你为什么索引超出范围错误。


代码错误


您正在创建 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;

}

你必须做


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


查看完整回答
反对 回复 2021-07-03
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

在我回答之前,我想强烈建议您在寻求外部帮助之前始终先真诚地尝试解决问题。我不一定认为您没有尝试过,但是通过逐步调试调试器可以轻松识别此问题。

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

此时方法中出现问题Scatter

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

发生异常是因为GetBucketNumber将输入乘以 10,但您使用的是乘以的值作为 的索引buckets


查看完整回答
反对 回复 2021-07-03
  • 2 回答
  • 0 关注
  • 187 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信