【问题标题】:Changing sorting algorithm java更改排序算法java
【发布时间】:2018-11-26 18:56:37
【问题描述】:

在此处启动 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

【问题讨论】:

  • 请阅读“如何创建minimal reproducible example”。然后使用edit 链接改进您的问题(不要通过 cmets 添加更多信息)。否则我们无法回答您的问题并为您提供帮助。

标签: java sorting


【解决方案1】:

如果您只是希望排序成功,我建议利用 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 好运,希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 2013-09-04
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 2014-03-13
    相关资源
    最近更新 更多