【问题标题】:Bubble-Sort with 2D Array使用二维数组进行冒泡排序
【发布时间】:2010-12-23 18:06:36
【问题描述】:

您好,我知道如何为一维数组实现简单的冒泡排序。但是对于二维或多维,这就是我的问题所在。

到目前为止,我一直在使用它对一维数组进行排序,就像一个魅力。但主要是整数,而不是字符串:

boolean sort;

do{
    sort = true;

    for (int i = 0; i < testarray.length - 1; i++){
        if(testarray[i] > testarray[i+1]){
            temp = testarray[i];
            testarray[i] = testarray[i+1];
            testarray[i+1] = temp;           
            sort = false;
        }
    }

}while(!sort);

    // Descending Output
    // for (int k = testarray.length - 1; k >= 0 ; k--){

    // Ascending Output
    for (int k = 0; k < testarray.length ; k++){
        System.out.print(testarray[k] + ", ");
    }

假设我有:

客户编号、姓名、姓氏、地址

String customers[][] = {{"123", "John", "Doe", "Somewhere"}, {"007", "James", "Bond", "MI5"}, {"1337", "Lolcat", "Izgud", "Saturn"}}

现在,我想选择对要排序的内容进行排序:客户编号、姓名、姓氏或地址。之后我想根据我想要的升序或降序输出它。

我只是不知道如何使用冒泡排序来实现这一点。我想留在冒泡排序中,没有其他排序算法,我想了解冒泡排序在这种情况下是如何工作的。

对于升序和降序,我的想法是:我可以做一个 if 循环。例如if (asc == 1) then output ascending, else output descending。然后将通过控制台询问 asc。

非常感谢任何帮助。

【问题讨论】:

  • 我必须成为那个说它的人:永远不要使用 BubbleSort!期间。
  • 看起来不像你想对一个二维数组进行排序,而是你想对一个元素是数组的数组进行排序。不同之处在于内部数组对 sort 函数没有什么特别之处。它们只是要排序的数组元素。
  • mitch:如果你这样做,你可能根本不应该对自己进行排序,而只依赖容器类和排序函数。但是,我几乎不认为这是问题的重点。冒泡排序是一种很好的排序算法,它易于理解,而且实现起来也不难。非常适合自学基础知识
  • mitch:这是在有人试图用他们的第一个排序算法弄湿他们的脚的情况下。不是每个人在第一次尝试时都会从他们的 *ss 中提取递归排序。

标签: java sorting multidimensional-array bubble-sort


【解决方案1】:

二维数组基本上只是由数组组成的一维数组。

只需使用与您相同的代码,而不是整数,移动内部数组。

要知道一个数组是否比下一个“大”,请比较正确数组成员的字符串值(如姓名或姓氏,..)。为此,您可以使用 String CompareTo 方法。

最后一点:如果内部数组实际上是包含信息的对象,则您给出的示例会更好。这样,您可以为所有字段使用单独的数据类型,而不是全部将它们设为字符串。

例如:

  class Person
  {
       int customerNumber;
       String name;
       String surName;
       String address;
  };

编辑:实际回答您的问题:

改变你的程序如下:

更改临时声明:

 String [] temp;

然后换行:

 if(testarray[i] > testarray[i+1])

进入:

 if(testarray[i][1] > testarray[i+1][1])

它会起作用并按名称排序

R

【讨论】:

    【解决方案2】:

    我猜你想将“123”、“john”、“doe”和“somewhere”组合在一起。

    我建议你使用一个对象,比如说

    public object Person {
        private int id;
        private String name;
        private String surname;
        private String address;
    }
    

    添加常用的 getter 和 setter。

    您可以拥有一个普通的 Person 对象数组,并使用冒泡排序算法对它们进行排序。您可以创建多个自定义比较器,将 id、姓名、姓氏或地址与冒泡排序算法进行比较。

    排序方法的签名应该是这样的

    public Person[] bubbleSort(Person[] persons, Comparator comp)
    

    【讨论】:

      【解决方案3】:

      在二维数组中,包含的对象的类型从intInteger 更改为String[](注意:这是一个字符串数组)。这就是您需要将temp 的类型更改为。

      最大的变化将是您的比较。您不能只使用&lt; 比较两个字符串数组——但您已经知道这一点。您需要做的是为自己构建一个方法,该方法接受两个 String[] 参数并根据第一个参数是否小于/等于/大于第二个参数返回负数、0 或正数。然后,您可以对该方法的结果进行&lt; / &gt; 比较以确定您的排序顺序。

      如果您希望能够使用几种不同的排序标准,您需要通过(例如)传递另一个参数来告诉它如何工作,从而使比较函数更加通用,或者您需要几个不同的比较函数,并使用ifswitch 来决定在排序期间使用哪一个。

      至于手动比较两个String数组,基本方法是:使用String.compareTo()比较第一个键字符串。如果结果不为 0,则返回。如果为 0,则第一个键相等,您需要比较下一个键。如果您的键用完但仍为 0,则您的两个元素的键相等,您返回 0。

      【讨论】:

        【解决方案4】:

        您可以保持相同的排序算法。它仍然不知道二维数组。你必须想出一个比较函数,它接受两个一维数组并判断哪个更大。

        【讨论】:

        • 嗯?我怎样才能保留它?当我有 3 个客户时,我希望他们在名称之后按升序排序:客户[0][2] = xerxes,客户 [1][2] = abrahams,客户 [2][2] = cusfolk。所以它将被排序:abrahams [1][2]、cusfolk [2][2] 和 xerxes [0][2]。
        猜你喜欢
        • 2019-04-14
        • 1970-01-01
        • 2020-06-26
        • 1970-01-01
        • 2016-07-05
        • 1970-01-01
        • 1970-01-01
        • 2014-06-10
        相关资源
        最近更新 更多