Как исправить программу для пирамидальной сортировки?

Пирамидальная сортировка (или сортировка кучей) - это эффективный алгоритм сортировки, использующий структуру данных "куча" для упорядочивания элементов. Он имеет сложность O(n log n) в худшем и среднем случаях, где n - размер массива, который необходимо отсортировать.

Для исправления программы для пирамидальной сортировки необходимо следовать следующим шагам:

1. Реализуйте метод для построения кучи. Куча - это двоичное дерево, у которого значение каждого узла больше (или меньше) значений его потомков. Метод должен принимать массив и его длину, и строить кучу, перемещая элементы массива в соответствующие им позиции кучи. Правильная реализация метода для построения кучи позволит нам использовать кучу и для сортировки, и для удаления минимального (или максимального) элемента.

2. Реализуйте метод для сортировки массива. Он должен использовать построенную кучу для поэлементного удаления и возврата минимального (или максимального) элемента. Этот метод также должен изменять длину массива по мере удаления элементов так, чтобы отсортированные элементы занимали конец массива.

Вот код, который реализует пирамидальную сортировку на языке Java:

public class HeapSort {
    
    public static void sort(int[] arr) {
        int n = arr.length;
        
        // Построение кучи (перегруппировка массива)
        for (int i = n / 2 - 1; i >= 0; i--)
            heapify(arr, n, i);
        
        // Извлечение элементов из кучи по одному и добавление в конец массива
        for (int i = n - 1; i >= 0; i--) {
            // Перемещение текущего корня в конец
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
            
            // Вызов метода для перестройки кучи на уменьшенном массиве
            heapify(arr, i, 0);
        }
    }
    
    // Метод для перестройки кучи по заданной позиции
    static void heapify(int[] arr, int n, int i) {
        int largest = i; // Инициализируем наибольший элемент как корень
        int l = 2 * i + 1; // Левый потомок
        int r = 2 * i + 2; // Правый потомок
        
        // Если левый потомок больше корня
        if (l < n && arr[l] > arr[largest])
            largest = l;
        
        // Если правый потомок больше, чем наибольший элемент на данный момент
        if (r < n && arr[r] > arr[largest])
            largest = r;
        
        // Если наибольший элемент не корень
        if (largest != i) {
            int swap = arr[i];
            arr[i] = arr[largest];
            arr[largest] = swap;
            
            // Рекурсивный вызов метода для перестройки на оставшейся куче
            heapify(arr, n, largest);
        }
    }
    
    // Метод для вывода массива на экран
    static void printArray(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; ++i)
            System.out.print(arr[i] + " ");
        System.out.println();
    }
    
    // Тестирование
    public static void main(String[] args) {
        int[] arr = { 12, 11, 13, 5, 6, 7 };
        int n = arr.length;
        
        System.out.println("Исходный массив:");
        printArray(arr);
        
        sort(arr);
        
        System.out.println("Отсортированный массив:");
        printArray(arr);
    }
}

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

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