簡體   English   中英

索引從1到n的HeapSort算法,實際代碼必須從0到n-1

[英]HeapSort Algorithm Indexed 1 through n, and actual code has to be from 0 to n-1

我對算法有點陌生,想實現堆排序算法。 該算法如下:

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

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

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

 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之后嘗試遍歷數組時,它沒有給出已排序的數組。 任何想法如何解決堆排序?

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

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

Left(i)返回2i

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

向右(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

如果要啟動表格索引1,則可以這樣初始化數組:[-x,16,14,10,8,7,9,3,2,4,1] -x是數組[0] ,換句話說,您可以忽略array [0]中的元素。

如果要開始從索引0開始,則必須修改函數LEFT(i)和RIGHT(i)。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM