Как изменить пирамидальну сортировку?

void heapify(int arr[], int n, int i)
{
    int largest = i;   
    int l = 2*i + 1; // левый = 2*i + 1
    int r = 2*i + 2; // правый = 2*i + 2
    if (l < n && arr[l] > arr[largest])
        largest = l;
    if (r < n && arr[r] > arr[largest])
        largest = r;
    if (largest != i)
    {
        swap(arr[i], arr[largest]);
 
        heapify(arr, n, largest);
    }
}
 
void heapSort(int arr[], int n)
{
 
    for (int i = n / 2 - 1; i >= 0; i--)
        heapify(arr, n, i);
 
    for (int i=n-1; i>=0; i--)
    {
        swap(arr[0], arr[i]);
 
        heapify(arr, i, 0);
    }
}

Добрый день, хочу задать вот такой вопрос: вот код пирамидального сортировки, а как его можно изменить так, чтобы в первой функции не было рекурсии и можно именно пирамидальное сортировки в одной функции.Ну или хотелось б упрощенний вариант.Буду благодарен за помощь


Ответы (1 шт):

Автор решения: n1tr0xs

Вот так можно:

void sift(int *numbers, int root, int bottom) {
    int maxChild;
    bool done = false;
    while ((root * 2 <= bottom) && (!done)){
        maxChild = ((root*2 == bottom) ||(numbers[root*2] > numbers[root*2+1])) ? root*2 : root*2+1
        if (numbers[root] < numbers[maxChild]){
            std::swap(numbers[root], numbers[maxChild]);
            root = maxChild;
        }
        else
            done = true;
    }
}

void heapSort(int *numbers, int array_size){
    for (int i = (array_size / 2); i >= 0; --i)
        sift(numbers, i, array_size - 1);
    for (int i = array_size-1; i >= 1; --i){
        std::swap(numbers[0], numbers[i])
        sift(numbers, 0, i-1);
    }
}
→ Ссылка