【问题标题】:I have been trying to sort my now combined array from smallest to largest我一直在尝试将我现在组合的数组从最小到最大排序
【发布时间】:2021-03-29 11:47:27
【问题描述】:

在过去的几天里,我一直在自己练习如何对 Java 数组进行排序。我想对我现在连接的数组从最小到最大进行排序。我很挣扎,需要指导。有人可以向我解释我做错了什么吗?我想从我目前的错误中吸取教训。

代码:


public static void main(String[] args) {
        // merge these arrays: ([0,3,4,31],[4,6,30])
        // process below is to create an array to fit the lengths of arr3 and 4
        int[] arr3 = { 0, 3, 4, 31 };
        int[] arr4 = { 4, 6, 30 };
        int[] arr5 = new int[arr3.length + arr4.length];

        // this loop gets the first indices of arr3
        for (int i = 0; i < arr3.length; i++) {
            arr5[i] = arr3[i];

        }
        // this array concat elements of arr4
        for (int k = 0; k < arr4.length; k++) {
            arr5[arr3.length + k] = arr4[k]; //
        }

        int small = 0;
        int large = arr5.length - 1;

        for (int f = 0; f < arr5.length; f++) {
            if (arr5[f] < arr5[small]) {
                arr5[small] = arr5[f];
                small++;
            } else {
                arr5[large] = arr5[f];
                large--;
            }
        }

        // prints out the new array
        System.out.println(Arrays.toString(arr5));

    }

} 

我试图在输出控制台中获得的输出:

[0,3,4,4,6,30,31]

我得到的是什么:

[0, 3, 4, 31, 4, 3, 0]

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    平均而言,最佳排序算法的时间复杂度为O(n log n),您的主循环在哪里:

    for (int f = 0; f < arr5.length; f++) {
        if (arr5[f] < arr5[small]) {
            arr5[small] = arr5[f];
            small++;
        } else {
            arr5[large] = arr5[f];
            large--;
        }
    }
    

    具有复杂性O(n),这意味着缺少某些东西。更容易实现的排序是冒泡排序:

      for(int i=0; i < arr5.length; i++){
            for(int j=1; j < arr5.length -i ; j++){
                if(arr5[j-1] > arr5[j]){
                    //swap elements
                    int temp = arr5[j-1];
                    arr5[j-1] = arr5[j];
                    arr5[j] = temp;
                }
            }
        }
    

    具有复杂性O(n^2)。该算法是您的起点;看看here 更深入地解释它,包括插图。

    【讨论】:

      【解决方案2】:

      如果您要组合的两个数组总是已经排序,您可以使用单个循环,其中两个变量存储每个数组中的当前索引,并每次比较相应的值以找到较小的值。

      int idx = 0, idx2 = 0;
      for(int i = 0; i < arr5.length; i++){
          if(idx2 == arr4.length || idx < arr3.length && arr3[idx] < arr4[idx2]){
              arr5[i] = arr3[idx++];
          } else {
              arr5[i] = arr4[idx2++];
          }
      }
      

      Demo

      否则,最简单的解决方案是使用冒泡排序(如果您不能使用java.util.Arrays.sort)。

      for(int i = 0; i < arr5.length; i++){
          for(int j = 1; j < arr5.length; j++){
              if(arr5[j] < arr5[j-1]){
                  final int temp = arr5[j];
                  arr5[j] = arr5[j-1];
                  arr5[j-1] = temp;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-09
        • 1970-01-01
        • 1970-01-01
        • 2018-06-03
        • 1970-01-01
        相关资源
        最近更新 更多