Алгоритм пирамидальная сортировка. Сортировка кучей. Heap sort. JavaScript.
Пирамидальная сортировка, пример на Си.
Пирамидальная сортировка. Два потомка у узла. /***
Пирамидальная сортировка
Пирамида - 2 потомка у узла имеют
значение меньше чем у него. Таким
образом, гарантированно можно извлечь
наибольший элемент, затем пирамиду надо
перебалансировать. Время - O(N*log2 N)
***/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LEFT(i) ((i<<1)+1) //i*2 + 1
#define RIGHT(i) ((i<<1)+2)
#define SWAP(v,a,b) {int tmp=v[a];v[a]=v[b];v[b]=tmp;}
void heapify(int v[], int i, int N){
while(1){
...
Пирамидальная сортировка.
Каждый узел имеет 2 (или более) потомка. Значение в потомках меньше, чем в вершине. Таким образом, на вершине дерева мы имеем наибольший узел. Все дерево или пирамида располагаются в одномерном массиве. Координаты легко вычисляются.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LEFT(i) ((i<<1)+1) //i*2 + 1
#define RIGHT(i) ((i<<1)+2)
#define SWAP(v,a,b) {int tmp=v[a];v[a]=v[b];v[b]=tmp;}
void heapify(int v[], int i, int N){
while(1){
int left=LEFT(i), right=RIGHT(i), largest=i;
if(left<N && v[left]>v[i]) largest=left;
if(right<N && v[right]>v[largest])largest=right;
...