【问题标题】:What's wrong with my HeapSort code?我的 HeapSort 代码有什么问题?
【发布时间】:2016-01-31 01:26:23
【问题描述】:

我正在尝试在 java 中编写一个 heapsort 方法,但它并没有完全按照我的意愿工作:

public class HeapSort {

    private static int n;

    private static void swap(int[] A, int a, int b)
    {
        int tmp = A[a];
        A[a] = A[b];
        A[b] = tmp;
    }

    private static void insert(int[] A, int i)
    {
        int left = i * 2;
        int right = left + 1;
        int max = i;

        if (left <= n && A[left] < A[max]){ 
            max = left;
        }
        if (right <= n && A[right] > A[max]) {
            max = right;
        }
        if (max != i) {
            swap(A, i, max);
            insert(A, max);
        }
    }

    public static void HeapSort(int[] A)
    {
        n = A.length - 1;

        for (int i = n / 2; i >= 0; i--)
            insert(A, i);

        for (int i = n; i > 0; i--) {
            swap(A, 0, i);
            n--;
            insert(A, 0);
        }
    }

    public static void main(String[] args){
        int[] A = new int[] {9, 2, 8, 1, 4};
        System.out.println(java.util.Arrays.toString(arr));
        HeapSort(A);
        System.out.println(java.util.Arrays.toString(arr));
    }
}

它适用于某些数组,但是像 9、2、8、1、4 这样的数组将被排序为 1、4、2、8、9。那么为什么不以正确的方式对数组进行排序呢?

【问题讨论】:

    标签: java arrays sorting heap heapsort


    【解决方案1】:
    if (left <= n && A[left] > A[i]){ 
         max = left;
    }
    

    试试这个看看。 我已经制作了完整的程序如下。这适用于您提供的输入。

    public class HeapSort {
    
    private static int n;
    
    private static void swap(int[] A, int a, int b)
    {
        int tmp = A[a];
        A[a] = A[b];
        A[b] = tmp;
    }
    
    private static void insert(int[] A, int i)
    {
        int left = i * 2;
        int right = left + 1;
        int max = i;
    
        if (left <= n && A[left] > A[i]){ 
            max = left;
        }
        if (right <= n && A[right] > A[max]) {
            max = right;
        }
        if (max != i) {
            swap(A, i, max);
            insert(A, max);
        }
    }
    
    public static void HeapSort(int[] A)
    {
        n = A.length - 1;
    
        for (int i = n / 2; i >= 0; i--)
            insert(A, i);
    
        for (int i = n; i > 0; i--) {
            swap(A, 0, i);
            n--;
            insert(A, 0);
        }
    }
    
    public static void main(String[] args){
        int[] A = new int[] {19, 6, 28, 1, 0};
        int[] B = new int[] {1, 2, 4, 8, 9, 0};
        System.out.println(java.util.Arrays.toString(A));
        System.out.println(java.util.Arrays.toString(B));
        HeapSort(A);
        HeapSort(B);
        System.out.println(java.util.Arrays.toString(A));
        System.out.println(java.util.Arrays.toString(B));
    }
    

    }

    这是输出。

    [19, 6, 28, 1, 0]
    [1, 2, 4, 8, 9, 0]
    [0, 1, 6, 19, 28]
    [0, 1, 2, 4, 8, 9]
    

    【讨论】:

    • 它适用于 9、2、8、1、4,但它不适用于 19、6、28、1、0。它返回 0、1、6、28、19。所以为什么不交换 28 和 19?
    • 好的,更新的代码现在可以工作了。我只想知道运行时间是多少。
    【解决方案2】:

    如果你定义left = i * 2,你的堆的根应该存储在A[1],而不是A[0]。通过不使用索引0 处的数组,您始终可以说节点i 的左右子节点分别为2*i2*i+1

    基本上,在您的HeapSort 中,您应该将 0 更改为 1(其中有 4 个)。使用数组{0, 9, 2, 8, 1, 4} 对其进行测试。

    另外,insert 中的比较也是错误的。应该是A[left] &gt; A[max]

    【讨论】:

    • 它适用于 9, 2, 8, 1, 4 但对于 0, 9, 2, 8, 1, 4 它返回为 1, 2, 4, 8, 9, 0。为什么是这样做的吗?
    猜你喜欢
    • 2011-07-28
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多