[英]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.