Я пытаюсь создать двоичную кучу с массивами. Я успешно сделал кучу с 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);
}
}
Любая помощь, чтобы понять, как эти две функции не работают должным образом, будет принята с благодарностью.
Я думаю, что проблема 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);
}
}
Других решений пока нет …