Чтобы узнать сортировку кучи, вы должны сначала понять концепцию кучи. Он может быть приблизительным в качестве метода хранения массива в качестве полностью двоичного дерева. Но есть и другие свойства, которые похожи на бинарные сортирующие деревья. Существуют различия между самой большой кучей и наименьшей кучей. своего детского узла. Сортировка кучи обычно использует самую большую кучу, в то время как самая маленькая куча может построить приоритетную очередь. Существует метод в куче, который используется для поддержания свойств кучи, которая является методом MaxHeap в нашем коде ниже. массив, и второй параметр - это регулировать кучу. Действительные элементы фактически хранятся в куче. Возможно, длина массива - это количество элементов, фактически хранящихся в куче, но не обязательно все данные, которые нам нужны для создания максимальной кучи. Введение в алгоритм гласит, что левый подзадуватель составляет 2xi, но наш массив имеет значение от 0, поэтому левый подземель становится 2xi+1. 2 таково, что дочерние узлы этих точек - все листовые узлы, поэтому мы строим максимальную кучу, сортируя ее снизу вверх. Убедитесь, что все узлы в нашей куче соответствовали максимальным свойствам кучи. Наконец, сортировка кучи состоит в том, чтобы снять первый узел, снова сортировать оставшиеся узлы, а затем вывести корневой узел. Это гарантирует, что каждый раз, когда мы его вынимаем, это максимальное значение.
Кода -копия выглядит следующим образом:
Общедоступный класс Heapsort {
private int getleft (int i) {
вернуть 2*i+1;
}
private int get Right (int i) {
вернуть 2*i+2;
}
public void maxheap (int [] heap, int loc, int size) {
int l = getleft (loc);
int r = getright (loc);
int самый большой = loc;
if (l <size && heap [l]> heap [loc]) {
Самый большой = l;
}
if (r <size && heap [r]> Heap [самый большой]) {
Самый большой = r;
}
if (самый большой! = loc) {
int cache = Heap [loc];
куча [loc] = куча [самое большое];
куча [самое большое] = кэш;
maxheap (куча, большой, размер);
}
}
public void buildHeap (int [] heap) {
для (int i = heap.length/2; i> = 0; i-) {
maxheap (heap, i, heap.length);
}
}
public void sort (int [] heap) {
BuildHeap (Heap);
для (int i = heap.length-1; i> 1; i-) {
int cache = Heap [0];
куча [0] = куча [i];
Heap [i] = cache;
maxheap (куча, 0, i);
}
int cache = Heap [0];
куча [0] = куча [1];
куча [1] = cache;
}
public static void main (string [] args) {
int [] heap = new int [] {4,1,5,3,7,12,65,7};
Heapsort hs = new Heapsort ();
Hs. Sort (Heap);
для (int i = 0; i <heap.length; i ++) {
System.out.println (Heap [i]);
}
}
}