Я новичок в алгоритмах и хотел реализовать алгоритм сортировки кучи. Алгоритм дается следующим образом:
Родитель(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);
}
}
build heap также работает, и единственный метод, который не работает, — это 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, он не дает отсортированный массив. есть идеи, как исправить пирамидальную сортировку?