# Adaptive Heap Sort

# Adaptive Heap Sort

Adaptive heap sort modifies standard heapsort to take advantage of existing order in the input. While classical heapsort treats all inputs the same, adaptive variants reduce work when the input is already partially sorted.

You use it when you want heap-based guarantees with some sensitivity to input structure.

## Problem

Given an array ( A ), sort it while:

* preserving ( O(n \log n) ) worst-case bounds
* reducing unnecessary operations when input is nearly sorted

## Idea

Standard heapsort:

1. builds a heap
2. repeatedly extracts the maximum

Adaptive variants improve efficiency by:

* detecting sorted prefixes or suffixes
* reducing heap construction work
* skipping redundant sift operations
* using weaker heap constraints (for example weak heaps)

## Algorithm (Basic Adaptive Strategy)

```id="t2k9x4"
adaptive_heap_sort(A):
    if is_nearly_sorted(A):
        return insertion_sort(A)

    build_heap(A)

    for i from n-1 down to 1:
        swap(A[0], A[i])
        sift_down(A, 0, i)
```

## Weak Heap Variant

A common adaptive improvement uses weak heaps:

* fewer comparisons during heap construction
* implicit structure that reduces swaps

```id="p6m3r8"
weak_heap_sort(A):
    build_weak_heap(A)

    for i from n-1 down to 1:
        swap(A[0], A[i])
        restore_weak_heap(A, i)
```

## Example

Input:

[
[1, 2, 3, 4, 5, 0]
]

Nearly sorted except one element. Adaptive strategy may:

* detect near-sortedness
* switch to insertion sort or reduce heap operations

Output:

[
[0, 1, 2, 3, 4, 5]
]

## Correctness

Heap-based sorting relies on the heap property:

[
\text{parent} \ge \text{children}
]

Each extraction places the next largest element in its correct position. Adaptive checks do not change correctness; they only reduce unnecessary work when structure is already favorable.

## Complexity

| case                 | time                      |
| -------------------- | ------------------------- |
| worst                | ( O(n \log n) )           |
| nearly sorted        | improved constant factors |
| best (with fallback) | ( O(n) ) possible         |

Space:

[
O(1)
]

## Comparison with Other Adaptive Sorts

| algorithm         | adaptivity | stability  |
| ----------------- | ---------- | ---------- |
| insertion sort    | high       | stable     |
| Timsort           | high       | stable     |
| heapsort          | low        | not stable |
| adaptive heapsort | moderate   | not stable |

## When to Use

Use adaptive heap sort when:

* worst-case guarantees are required
* memory must remain constant
* input may be partially sorted
* stability is not required

In practice, adaptive merge-based methods often outperform it, but heap-based methods remain valuable when memory constraints dominate.

