Основная проблема c заключается в том, что ваш maxHeapify
толкает вещи только на один уровень вниз. В большинстве. Нужно l oop и поместить элемент в правильное место.
Учитывая массив arr
, элемент i
и размер кучи n
, функция maxHeapify
работает следующим образом это:
// find the largest among arr[i], its right child, and its left child
while (i <= n) {
l = 2*i
r = l + 1
largest = i
if (l > n)
// left node is beyond the end of the heap
break
if (arr[l] > arr[largest])
largest = l
if (r <= n && arr[r] > arr[largest])
largest = r
if (largest == i)
// neither child is larger, so done
break
// swap node with largest child
swap(arr, i, largest)
i = largest
}
Это идея. Вам нужно превратить его в C код, но это не должно вызывать проблем.
Ваш случай 0, который строит кучу, почти верен. Это начинается в i = n
. Это будет работать, но это неэффективно. Как ни странно, вы все правильно поняли в методе heapsort.
Ваш heapSort
почти верен. Вы забыли, однако, что с каждым удалением из кучи нужно уменьшать размер кучи. Размер кучи не n
, а i
. Я изменил n
на i
в последнем звонке на maxHeapify
:
void heapSort(int *arr, int n)
{
for (int i = n / 2; i >= 1; i--)
maxHeapify(arr, n, i);
for (int i = n; i >= 1; i--)
{
swap(&arr[1], &arr[i]);
maxHeapify(arr, i, 1);
}
}