{
  "slug": "heap-build",
  "title": "Build a Max-Heap",
  "category": "Trees",
  "difficulty": "medium",
  "complexity": {
    "time": "O(n)",
    "space": "O(1)"
  },
  "idea": "A binary heap is a complete tree where every parent is at least as large as its children — stored as a plain array, with the children of index i at 2i+1 and 2i+2. Heapify works from the last parent backwards, sinking each value to where it belongs.",
  "code": [
    "for i = n/2 - 1 down to 0:",
    "    siftDown(i)",
    "siftDown(i): while a child is bigger,",
    "    swap with the larger child and follow it down"
  ],
  "example": {
    "array": [
      4,
      10,
      3,
      5,
      1,
      8,
      2
    ]
  },
  "invariant": "Each step is the real data structure at that step — the picture is a pure function of it.",
  "stepCount": 12,
  "steps": [
    {
      "i": 0,
      "op": "tree",
      "caption": "A heap is a complete tree: children of index i sit at 2i+1 and 2i+2.",
      "note": null,
      "codeLine": 1,
      "stats": null,
      "nodes": [
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h2",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h2",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 1,
      "op": "tree",
      "caption": "Sift down from 3.",
      "note": null,
      "codeLine": 1,
      "stats": null,
      "nodes": [
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "right",
          "focus": null,
          "badges": [
            "sift"
          ]
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h2",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h2",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 2,
      "op": "tree",
      "caption": "Compare 3 with its larger child 8.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "nodes": [
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "right",
          "focus": "compare",
          "badges": [
            "sift"
          ]
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h2",
          "side": "left",
          "focus": "compare",
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h2",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 3,
      "op": "tree",
      "caption": "The parent is smaller — sink it and lift the child.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "right",
          "focus": "swap",
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": "swap",
          "badges": [
            "sift"
          ]
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 4,
      "op": "tree",
      "caption": "Sift down from 10.",
      "note": null,
      "codeLine": 1,
      "stats": null,
      "nodes": [
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "left",
          "focus": null,
          "badges": [
            "sift"
          ]
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 5,
      "op": "tree",
      "caption": "Compare 10 with its larger child 5.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "nodes": [
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "left",
          "focus": "compare",
          "badges": [
            "sift"
          ]
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "left",
          "focus": "compare",
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 6,
      "op": "tree",
      "caption": "Sift down from 4.",
      "note": null,
      "codeLine": 1,
      "stats": null,
      "nodes": [
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": [
            "sift"
          ]
        },
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 7,
      "op": "tree",
      "caption": "Compare 4 with its larger child 10.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "nodes": [
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "compare",
          "badges": [
            "sift"
          ]
        },
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "left",
          "focus": "compare",
          "badges": null
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 8,
      "op": "tree",
      "caption": "The parent is smaller — sink it and lift the child.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "swap",
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "left",
          "focus": "swap",
          "badges": [
            "sift"
          ]
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 9,
      "op": "tree",
      "caption": "Compare 4 with its larger child 5.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "nodes": [
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "left",
          "focus": "compare",
          "badges": [
            "sift"
          ]
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "left",
          "focus": "compare",
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 10,
      "op": "tree",
      "caption": "The parent is smaller — sink it and lift the child.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "left",
          "focus": "swap",
          "badges": null
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": "swap",
          "badges": [
            "sift"
          ]
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 11,
      "op": "tree",
      "caption": "Max-heap ready — 10 sits at the root, and every parent outranks its children.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "settled",
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "left",
          "focus": "settled",
          "badges": null
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "right",
          "focus": "settled",
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": "settled",
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": "settled",
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": "settled",
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": "settled",
          "badges": null
        }
      ]
    }
  ]
}