java—我一直在尝试将我现在组合的数组从最小到最大排序

dwthyt8l  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(268)

在过去的几天里,我一直在练习如何对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]

t30tvxxf

t30tvxxf1#

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

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++];
    }
}

演示
否则,最简单的解决方案是使用冒泡排序(如果不能使用 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;
        }
    }
}
e5nqia27

e5nqia272#

平均而言,最佳排序算法的时间复杂度为 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) . 这个算法是你的起点;在这里有一个更深入的解释看看,包括插图。

相关问题