HeapSort算法索引1到n,实际代码必须从0到n-1

时间:2012-06-21 03:40:30

标签: java algorithm heap heapsort

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

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

左(I)  返回2i

右(I)  返回2i + 1

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

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);
    }
}

构建堆也有效,唯一不起作用的方法是heapsort。

 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之后遍历数组时它不会给出排序的数组。 任何想法如何修复heapsort?

2 个答案:

答案 0 :(得分:1)

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

=&GT;父(i)返回Math.floor((i - 1)/ 2)

左(i)返回2i

=&GT;左(i)返回2i + 1

右(i)返回2i + 1

=&GT;右(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

答案 1 :(得分:0)

如果要启动表单索引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;

     

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