【问题标题】:c# 2D array bubblesort [closed]c# 2D 数组冒泡排序 [关闭]
【发布时间】:2015-03-01 20:17:56
【问题描述】:

我正在尝试对二维数组执行冒泡排序,按第三个索引(整数)排序​​

string[,] edges = new string[,] { {"A", "B", "2"},
                                          {"A", "C", "3"},
                                          {"A", "E", "10"},
                                          {"B", "C", "5"},
                                          {"B", "D", "10"},
                                          {"C", "D", "2"},
                                          {"D", "E", "5"},
                                          {"E", "B", "3"}
                                        }; 

我在排序代码的 IF 语句上得到一个 IndexOutOfRangeException

        string[] temp = {};

        //sort edges and add them to sortedEdges - using bubblesort
        for (int i = 0; i < edges.Length - 1; i++){
            for (int j = 0; j < edges.Length - 1; j++){
                if (Int32.Parse(edges[i, 2]) > Int32.Parse(edges[i + 1, 2])){
                    //make a swap
                    //put array record i into temp holder
                    temp[0] = edges[i, 0];
                    temp[1] = edges[i, 1];
                    temp[2] = edges[i, 2];

                    //copy i + 1 into i
                    edges[i, 0] = edges[i + 1, 0];
                    edges[i, 1] = edges[i + 1, 1];
                    edges[i, 2] = edges[i + 1, 2];

                    //copy temp into i + 1
                    edges[i + 1, 0] = temp[0];
                    edges[i + 1, 1] = temp[1];
                    edges[i + 1, 2] = temp[2];

                }
            }
        }

我的问题是,我该如何解决这个问题,以使数组“edges”充满行,按第三列排序?

谢谢。

【问题讨论】:

  • 旁注:"3" 是一个字符串而不是“整数”。您确实应该使用适当的结构来存储数据,而不是在本质上无类型的数组中存储行。
  • 感谢您的反馈,我使用整数这个词只是为了指出我想对哪个字段进行排序。在 IF 语句中,我确实将其转换为整数。我意识到这可以做得更好,但我的主要目标是让事情以一种清晰的方式工作。
  • 提供输入数据、输出数据、预期输出数据、任何错误消息、编译器、您正在运行的系统等。即 所有影响您的程序正在做什么并告诉我们什么你想要它做。根据帮助链接。 PS:您必须使用@ 来联系不是提问者、回答者或迄今为止对您的帖子发表评论的人。 (搜索 stackexchange 通知。)
  • @user4416058 您应该将示例简化为整数的二维数组 (n x 1) - 所有逻辑都是相同的,但读者不会因为查看像 Int32.Parse(edges[i + 1, 2]) 这样的代码而感到痛苦。这样的重写也会使样本缩短近 3 倍。滥用数组来表示类通常是不受欢迎的,并且可能会招致反对意见。

标签: c# arrays sorting bubble-sort


【解决方案1】:

更新的 v-3

问题出在Length 这样定义的表中,在您的情况下是24,因为它似乎计算了两个维度中的所有元素。 请尝试以下代码:

string[] temp = new string[3];

for (int i = 0; i < edges.GetLength(0) - 1; i++){
    int j;
    j = 0;
    for (; j < edges.GetLength(0) - 1; j++){

        if (Int32.Parse(edges[j, 2]) > Int32.Parse(edges[j + 1, 2])){
            //make a swap
            //put array record j into temp holder
            temp[0] = edges[j, 0];
            temp[1] = edges[j, 1];
            temp[2] = edges[j, 2];

            //copy j + 1 into j
            edges[j, 0] = edges[j + 1, 0];
            edges[j, 1] = edges[j + 1, 1];
            edges[j, 2] = edges[j + 1, 2];

            //copy temp into j + 1
            edges[j + 1, 0] = temp[0];
            edges[j + 1, 1] = temp[1];
            edges[j + 1, 2] = temp[2];

        }
    }
}

您可以在此处找到(更新的)工作示例:https://dotnetfiddle.net/FQs4OA

【讨论】:

  • 谢谢,但我仍然遇到同样的错误。
  • 这或多或少是可以做任何事情的整个代码。我也不明白为什么我会收到错误。我会继续努力。
  • 谢谢,这对你有用吗?我得到了同样的错误。我已经稍微缩小了范围,超出范围是比较的第二部分。 Int32.Parse(edges[i + 1, 2])
  • 谢谢!这似乎可以防止错误现在我可以完成一些真正的工作。再次感谢。
  • @user4416058 请注意,按每个维度获取长度的正确方法是Array.GetLength(dimension) - 请参阅stackoverflow.com/questions/832655/…
猜你喜欢
  • 2012-11-14
  • 2021-08-15
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2012-02-10
  • 2018-05-18
  • 2013-06-28
  • 2015-01-27
相关资源
最近更新 更多