【问题标题】:Sorting from one array into another, Java从一个数组排序到另一个数组,Java
【发布时间】:2017-08-30 14:52:13
【问题描述】:

我的目标是将 ar[] 数组中的元素移动到 sorted[] 数组中,并将它们从最小到最大排序。我在这部分遇到了麻烦,因为我的循环应该找到数组中的最小元素,然后用大数字替换元素。我想我的大部分代码都写好了,但是当我运行程序时,sorted[] 数组中的每个元素都是 2。我在这里做错了什么?

public class Lab1
{
    public static void main(String argv[])
    {
        int ar[]     = { 7, 5, 2, 8, 4, 9, 6 };
        int sorted[] = new int[ar.length];
        int smallest = ar[0];
        int smallestindex = 0;

        for (int i=0; i<ar.length; i++)
        {
            for (int n=0; n<ar.length; n++)
            {
                if (ar[n] < smallest)
                {
                    smallest = ar[n];
                    smallestindex = n;
                }
            }

            sorted[i] = smallest;
            ar[i] = 1000000;
        }

        // print sorted array:
        for (int i=0; i<sorted.length; i++)
        {
            System.out.println("sorted[" + i + "] = " + sorted[i]);
        }
    }
}

【问题讨论】:

  • 在排序前复制数组。
  • 注意内部循环没有引用i?为什么它的结果会因索引而变化?
  • 这是一个错误的代码ar[i] = 1000000; 此外,为什么要将排序后的元素放在另一个数组中?如果您想保留原件,只需复制原件并处理您当前的阵列。

标签: java arrays sorting


【解决方案1】:

这样的事情呢?

又短又甜:

import java.util.Arrays;

public class Lab1
{
    public static void main(String argv[])
    {
        int ar[]     = { 7, 5, 2, 8, 4, 9, 6 };
        int sorted[] = ar.clone();
        Arrays.sort(sorted);

        System.out.println("Original array: " + Arrays.toString(ar));
        System.out.println("Sorted array: " + Arrays.toString(sorted));
    }
}

输出:

Original array: [7, 5, 2, 8, 4, 9, 6]
Sorted array: [2, 4, 5, 6, 7, 8, 9]

【讨论】:

    【解决方案2】:

    我现在没有我的电脑,但我认为问题在于,一旦你第一次将变量设置为 2,它就永远保持为 2,并且没有其他数字更小了。因此,我认为您只执行一次内部操作,并且值始终为 2。

    编辑。我认为将最小的初始化移动到拳头下方应该可行。

    【讨论】:

      【解决方案3】:

      当此条件不成立时,您没有执行任何操作。

      if (ar[n] < smallest)
      

      所以只有最小的元素可以通过这个检查并继续新的数组。

      您还可以像这样以更好的形状对数组进行排序

      List<Integer> ar = Arrays.as list ( *your numbers here*);
      

      Collections.sort(ar):

      【讨论】:

        【解决方案4】:

        哎呀,你的循环里面有问题, 将 ar[] 中最小的复制到 sorted[] 中,即 2, 所以你在 sorted[] 内的每个元素中都得到 2。

        for (int i=0; i<ar.length; i++)
            {
                for (int n=0; n<ar.length; n++)
                {
                    if (ar[n] < smallest)
                    {
                        smallest = ar[n]; <----YOU ALWAYS GET 2 HERE
                        smallestindex = n;
                    }
                }
        
                sorted[i] = smallest; <---- AND SET 2 TO YOUR sorted[] HERE
                ar[i] = 1000000;
            }
        

        我不知道您是想要解决方案还是自己解决,因为您的问题是问出了什么问题,但在这里

        for (int i=0; i<ar.length; i++)
            {
                for (int n=0; n<ar.length; n++)
                {
                    if (ar[n] < smallest)
                    {
                        smallest = ar[n];
                        smallestindex = n;
                        ar[n] = 1000000; <----CHANGE THE SMALLEST ITEM HERE RATHER THAN OUTSIDE
                    }
                }
        
                sorted[i] = smallest;            
            }
        

        顺便说一句,以更简单的方式制作排序副本:

        急忙复制一份:

        int[] sorted = ar.clone();
        

        然后,使用 Java Util 对其进行排序:

        Arrays.sort(sorted);
        

        只需 2 行即可获得所需的内容。

        【讨论】:

          【解决方案5】:

          我只是不明白,为什么我们需要这个,比如排序到另一个数组中。您可以使用 Arrays.sort() 方法在数组中排序,或者如果您想在不同的数组中排序,您可以采取以下步骤:

          1. 将数组复制到新数组。

          2. 对新数组进行排序,然后排序。

          如果你仍然想继续你的实现,那么我已经重构了你的代码。现在您的代码工作正常,如下所示:

          public class Prog1 {
              public static void main(String[] args) {
                  int ar[] = { 7, 5, 2, 8, 4, 9, 6 };
                  int sorted[] = new int[ar.length];
                  int smallest = ar[0];
                  int smallestindex = 0;
          
                  for (int i = 0; i < ar.length; i++) {
                      for (int n = 0; n < ar.length; n++) {
                          if (ar[n] < smallest) {
                              smallest = ar[n];
                              smallestindex = n;
                          }
                      }
          
                      sorted[i] = smallest;
                      //Your mistake was here.
                      ar[smallestindex] = 1000000;
                      smallest=ar[0];
                      smallestindex=0;
                  }
          
                  // print sorted array:
                  for (int i = 0; i < sorted.length; i++) {
                      System.out.println("sorted[" + i + "] = " + sorted[i]);
                  }
              }
          
          }
          

          您的错误是您没有重新分配“最小”变量。因为它指向数组的最小元素,所以它不会在下次运行时更新,因为数组中没有元素小于这个变量。希望你能明白。如果还有问题,你还有,请追问。

          【讨论】:

            【解决方案6】:

            因为每次你粉碎旧值(大值)并且你不保存它来转移
            smallest = ar[n]; minimumindex = n; 您需要添加另一个变量来更改单元格之间的值,或者使用 arraylist 更简单的方法。

                int ar[] = {7, 5, 2, 8, 4, 9, 6};
                int sorted[] = new int[ar.length];
                int smallest = ar[0];
                for (int i = 0; i < ar.length ; i++) {
            
                    for (int j = i + 1; j < ar.length; j++) {
            
                        if (ar[i] > ar[j]) {
            
                            smallest = ar[j]; //save small value
                            ar[j] = ar[i];//transaction between two comparables cells
                            ar[i] = smallest;//set small value as first
            
                        }
                        sorted[i]=ar[i]; //set first small value
                    }
            
                }
            
                // print sorted array:
                for (int i = 0; i < sorted.length; i++) {
                    System.out.println("sorted[" + i + "] = " + sorted[i]);
                }
            

            【讨论】:

              【解决方案7】:

              您似乎想使用一种称为“选择排序”的算法进行排序,但您的代码实现得很差。

              您可以从这位兄弟的问题中学习并查看以下答案: Selection Sort Example

              【讨论】:

                猜你喜欢
                • 2011-07-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-02-12
                • 1970-01-01
                • 1970-01-01
                • 2015-04-17
                相关资源
                最近更新 更多