Правильно, поэтому в основном вы берете кучу и вытаскиваете первый узел в куче - поскольку первый узел гарантированно будет самым большим / самым маленьким в зависимости от направления сортировки. Самое сложное - это перебалансировать / создать кучу.
Мне потребовалось два шага, чтобы понять процесс кучи - сначала подумать об этом как о дереве, обдумать его, а затем превратить это дерево в массив, чтобы он мог быть полезен.
Вторая часть этого - сначала пройти по ширине дерева, слева направо, добавив каждый элемент в массив. Итак, следующее дерево:
73
7 12
2 4 9 10
1
будет {73,7,12,2,4,9,10,1}
Первая часть требует двух шагов:
- Убедитесь, что у каждого узла есть два дочерних элемента (если у вас недостаточно узлов, чтобы сделать это, как в дереве выше.
- Убедитесь, что каждый узел больше (или меньше, если сортировать сначала мин), чем его дочерние элементы.
Таким образом, чтобы составить список чисел, вы добавляете каждое из них в кучу, а затем выполняете эти два шага по порядку.
Чтобы создать мою кучу выше, я сначала добавлю 10 - это единственный узел, так что ничего не делать.
Добавьте 12 как дочерний слева:
10
12
Это удовлетворяет 1, но не 2, поэтому я поменяю их местами:
12
10
Добавить 7 - ничего не делать
12
10 7
Добавить 73
12
10 7
73
10 <73, поэтому нужно поменять местами: </p>
12
73 7
10
12 <73, поэтому нужно поменять местами: </p>
73
12 7
10
Добавить 2 - ничего не делать
73
12 7
10 2
Добавить 4 - ничего не делать
73
12 7
10 2 4
Добавить 9
73
12 7
10 2 4 9
7 <9 - своп </p>
73
12 9
10 2 4 7
Добавить 1 - ничего не делать
73
12 9
10 2 4 7
1
У нас есть куча: D
Теперь вы просто удаляете каждый элемент сверху, каждый раз меняя местами последний элемент на вершину дерева, а затем заново балансируете дерево:
Сними 73 - поставь 1 на место
1
12 9
10 2 4 7
1 <12 - поменяйте местами </p>
12
1 9
10 2 4 7
1 <10 - так что поменяйте местами </p>
12
10 9
1 2 4 7
Снять 12 - заменить на 7
7
10 9
1 2 4
7 <10 - поменяйте местами </p>
10
7 9
1 2 4
Снимите 10 - замените на 4
4
7 9
1 2
4 <7 - своп </p>
7
4 9
1 2
7 <9 - своп </p>
9
4 7
1 2
Снять 9 - заменить на 2
2
4 7
1
2 <4 - поменяйте местами </p>
4
2 7
1
4 <7 - поменяйте местами </p>
7
2 4
1
Снимите 7 - замените на 1
1
2 4
1 <4 - поменять их местами </p>
4
2 1
Взять 4 - заменить на 1
1
2
1 <2 - поменяйте местами </p>
2
1
Взять 2 - заменить на 1
1
Взять 1
отсортированный список вуаля.