Вставка и сортировка в куче с помощью массива

Я пытаюсь создать двоичную кучу с массивами. Я успешно сделал кучу с buildHeap а также heapify, Моя проблема, когда я пытаюсь insert новый элемент в массив, и когда я пытаюсь отсортировать его с heapSort,

Вот что у меня есть для heapify функция:

void heap::Heapify(int arr[], int i){
int largest = i;
int L = LeftChild(i);
int R = RightChild(i);
if (L <= heapSize && arr[L] > arr[i])
largest = L;
else{
largest = i;
}

if (R <= heapSize && arr[R] > arr[largest]){
largest = R;
}
if(largest != i){
int temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
Heapify(arr, largest);
}
}

А вот мой buildHeap функция:

void heap::BuildHeap(int arr[]){
for(int i = (heapSize/2)-1; i >= 0; i--){
Heapify(arr, i);
}
}

Эти две функции работают, в то время как следующие не работают, для вставки он не вставляет ее в правильном месте.

Здесь insert функция:

void heap::Insert(int arr[], int key){
heapSize++;
int i = heapSize - 1;

while(i > 0 && arr[Parent(i)] <= key){
arr[i] = arr[Parent(i)];
i = Parent(i);
}

arr[i] = key;
}

С heapSort Функция это сортирует по большей части, но печатает это так (первая строка — это куча перед сортировкой):

32 24 5 19 23 4 3 11 2 12
5 2 4 3 23 19 32 11 24 12

а вот мой heapSort функция:

void heap::HeapSort(int arr[]){
for(int i = heapSize - 1; i >= 0; i--){
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;

heapSize = heapSize - 1;
Heapify(arr, 0);
}
}

Любая помощь, чтобы понять, как эти две функции не работают должным образом, будет принята с благодарностью.

0

Решение

Я думаю, что проблема Off-by-One-Error в этих строках

if (L <= heapSize && arr[L] > arr[i])

if (R <= heapSize && arr[R] > arr[largest]){

они оба должны быть < вместо <= потому что последний элемент находится в heapsSize-1,

Другие детали

void heap::Heapify(int arr[], int i){
int largest = i; // setting largest to i first time
int L = LeftChild(i);
int R = RightChild(i);
if (L <= heapSize && arr[L] > arr[i]) // compare with arr[i] is not wrong but doesn't express the intent.
largest = L;
else{
largest = i; // setting largest to i second time
}

if (R <= heapSize && arr[R] > arr[largest]){
largest = R;
}
if(largest != i){
int temp = arr[i];      // these 3 lines are the std::swap
arr[i] = arr[largest];  // or you could roll your own function that does the same.
arr[largest] = temp;    // better expressing the intent.
Heapify(arr, largest);
}
}

Переписан на

void heap::Heapify(int arr[], int i){
int largest = i;
int L = LeftChild(i);
int R = RightChild(i);

if (L < heapSize && arr[L] > arr[largest]) {
largest = L;
}

if (R < heapSize && arr[R] > arr[largest]) {
largest = R;
}

if(largest != i){
swap(arr[i], arr[largest]);
Heapify(arr, largest);
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector