【问题标题】:HeapSort Algorithm Indexed 1 through n, and actual code has to be from 0 to n-1HeapSort 算法索引 1 到 n,实际代码必须从 0 到 n-1
【发布时间】:2012-06-21 03:40:30
【问题描述】:

我对算法有点陌生,想实现堆排序算法。 算法如下:

父母(i) 返回 Math.floor(i/2)

左(i) 返回 2i

右(i) 返回 2i+1

然后是恢复 heep 属性的 HEAPIFY 方法。算法如下:

HEAPIFY(A, i)
 l = Left(i)
 r = Right(i)
 if (l <= heap-size[A] and A[l] > A[i]
  then largest = l
 else largest = i
 if r <= heap-size[A] and A[r] > A[largest]
  then largest = r
 if largest != i
  then exchange A[i] <-> A[largest]
       HEAPIFY(A, largest)

我实现这个方法的代码是:

public static void HEAPIFY(int[] A, int i) {
    int l = LEFT(i);
    int r = RIGHT(i);
    int largest = 0;
    if (l < A.length && A[l] > A[i]) {
        largest = l;
    } else {
        largest = i;
    }

    if (r < A.length && A[r] > A[largest]) {
        largest = r;
    }

    if (largest != i) {
        int temp = A[i];
        A[i] = A[largest];
        A[largest] = temp;
        HEAPIFY(A, largest);
    }
}

现在我的问题是在书中算法通过绘制堆和数组树来显示 例如数组是:[16,14,10,8,7,9,3,2,4,1] 对于树和数组,它的索引从 1 到 n,所以 Array[1] = 16和编码Array [0] = 16。现在我无法调整heapify方法以从索引1开始并上升到1,或者以某种方式使其从0开始并让堆从0索引到n-1。

对不起,如果它有点令人困惑,我仍然感到困惑,但我真的很感激一些帮助。

谢谢大家

现在 HEAPIFY 可以工作了,下面的代码是构建堆的代码:

public static void BUILD_HEAP(int[] A) {
    heapSize = A.length;
    for (int i = (int) Math.floor(A.length / 2.0); i >= 0; i--) {
        HEAPIFY(A, i);
    }
}

构建堆也可以,唯一不起作用的方法是堆排序。

 public static void HEAPSORT(int[] A) {
    BUILD_HEAP(A);
    for (int i = A.length-1; i >= 1; i--) {
        int temp = A[0];
        A[0] = A[i];
        A[i] = temp;
        heapSize = heapSize-1;
        HEAPIFY(A,0);
    }
}

这必须排序,但是当我在调用 heapsort 后尝试遍历数组时,它不会给出排序后的数组。 任何想法如何修复堆排序?

【问题讨论】:

    标签: java algorithm heap heapsort


    【解决方案1】:

    Parent(i) 返回 Math.floor(i/2)

    => Parent(i) 返回 Math.floor((i - 1) / 2)

    Left(i) 返回 2i

    => 左(i) 返回 2i + 1

    Right(i) 返回 2i+1

    => Right(i) 返回 2i + 2

    您可以通过摆弄(我实际上是这样做的)或考虑 j = i - 1 来解决这个问题。

    如果 i' = 2 i 并且 j = i - 1 所以 i = j + 1

    j' = i' - 1 = (2i) - 1 = (2(j + 1)) - 1 = 2j + 1

    【讨论】:

    • 非常感谢,我已修复它,现在它可以工作了。如果我想遍历它并打印所有元素,我会遍历数组吗?
    • 我没有检查你所有的代码,但是 heapsort 的一般想法是,在你调用 HEAPSORT(A) 之后,数组 A 已经被排序,所以是的,我希望你只需通读数组即可按排序顺序取出元素。
    • 是的,在调用 heapsort(A) 之后,我遍历数组,但我得到的只有少数几个不是全部排序的
    • 据我所见,发布的代码写入 heapsize 但从未读取它。 HEAPSORT 中的 for 循环背后的想法是,在 i 传递之后,数组末尾的 i 个条目是数组中的第 i 个最大值和长度 - 数组开头的 i 个条目是大小为长度的堆 - i,从中选取下一个第 i 个最大值。所以 HEAPIFY 想使用 heapSize,而不是 A.length
    【解决方案2】:

    如果你想从索引 1 开始,那么你可以像这样初始化数组: [-x,16,14,10,8,7,9,3,2,4,1] -x 是数组[0],也就是说,你可以忽略数组[0]中的元素。

    如果要从表格索引0开始,则必须修改函数LEFT(i)和RIGHT(i)。

    LEFT(i) 返回 2*i+1;

    RIGHT(i) 返回 2*i+2;

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 2022-01-13
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多