java - 改变java排序算法

标签 java sorting

在这里启动 Java 编码器。我想知道如何更改我的代码,以便它通过始终将最大值交换到第一个来对数组进行排序。示例输出应为:

[3,1,2,0][3,2,1,0]。

public class Sorting {

static void biggest(int[] arr, int start, int end) {
    for (start = 0; start < arr.length; start++) {
        for (end = start + 1; end < arr.length; end++) {
            if (arr[start] < arr[end]) {
                int temp = arr[end];
                arr[end] = arr[start];
                arr[start] = temp;
                System.out.println(Arrays.toString(arr));

            }
        }
    }
}

public static void main(String[] args) {
    int[] arr = {0, 1, 2, 3};
    int temp = 0;
    for (int i = 0; i < 4; ++i) {
        biggest(arr, temp, 4 - 1);
        for (int j = 0; j < 4; ++j) {
        }
        ++temp;
    }
}

提前致谢, - Em

最佳答案

如果您只是希望排序成功,我建议利用 Java 内置的排序方法,然后按照建议反转列表 here :

Arrays.sort(arr);
ArrayUtils.reverse(arr); 

但听起来你的问题的精神是为此目的修改你的代码。这是我想出的解决方案:

import java.util.Arrays;

public class Sorting {

static void biggest(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        System.out.println(Arrays.toString(arr));
        int max, maxAt = i;
        for (int j = i; j < arr.length; j++) {
            maxAt = arr[j] > arr[maxAt] ? j : maxAt;
        }
        max = arr[maxAt];
        if (arr[i] < max) {
            arr[maxAt] = arr[i];
            arr[i] = max;
        }
    }
}

public static void main(String[] args) {
    int[] arr = {0, 1, 2, 3};
    biggest(arr);
    System.out.println(Arrays.toString(arr));
}
}

首先,您有很多不需要的额外代码。在你的 main 中有一个循环是一个坏主意。这应该由辅助函数来处理。您还有很多冗余声明(例如 startend)。您的辅助函数走在正确的轨道上,但由于您的主循环,您的时间复杂度为 0(n²)。消除它可以让我的时间复杂度为 O(logn)。撇开复杂性不谈,逻辑方面的关键区别在于内部循环:

for (end = start + 1; end < arr.length; end++) {
        if (arr[start] < arr[end]) {
            int temp = arr[end];
            arr[end] = arr[start];
            arr[start] = temp;

在此循环中,您将使用您发现的第一个更大的数组条目交换数组条目。这将导致不必要的早期切换(如 1 和 2)。这是我的解决方案:

for (int j = i; j < arr.length; j++) {
        maxAt = arr[j] > arr[maxAt] ? j : maxAt;
    }
    max = arr[maxAt];
    if (arr[i] < max) {
        arr[maxAt] = arr[i];
        arr[i] = max;
    }

主要区别在于我搜索我们正在交换的条目之后的最大值条目。这样,当我们继续遍历数组时,我们总是会提出下一个最大的。

祝你学习 Java 好运,希望这会有所帮助!

关于java - 改变java排序算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53487376/

相关文章:

java - 为什么在 JavaFX 3D 分子示例中使用 3 个 Xform 对象

java - 带有 struts 标签的输出参数化 bean 属性

javascript - 如何根据具有不同排序顺序的多个值对 json 对象进行排序

javascript - Nodejs : sorting paragraph numbers

javascript - 自定义数组排序顺序 Javascript 的问题

python - 为文本文件中的每一行创建一个新列表?

java - Avro:序列化/反序列化包含 Enum 值的文件时出现 ClassCastException

java - Android FusedLocationProviderClient问题

java - 将JButton的大小设置为标签的长度和宽度

c 从文件中读取 float 并排序