64 lines
1.1 KiB
Markdown
64 lines
1.1 KiB
Markdown
|
---
|
||
|
title: Heapsort
|
||
|
TARGET DECK: Obsidian::STEM
|
||
|
FILE TAGS: algorithm::sorting
|
||
|
tags:
|
||
|
- algorithm
|
||
|
- sorting
|
||
|
---
|
||
|
|
||
|
## Overview
|
||
|
|
||
|
Property | Value
|
||
|
----------- | --------
|
||
|
Best Case | -
|
||
|
Worst Case | -
|
||
|
Avg. Case | -
|
||
|
Aux. Memory | -
|
||
|
Stable | -
|
||
|
Adaptive | -
|
||
|
|
||
|
![[heapsort.gif]]
|
||
|
|
||
|
```c
|
||
|
inline int left_child(int i) { return (i << 1) + 1; }
|
||
|
inline int right_child(int i) { return (i << 1) + 2; }
|
||
|
|
||
|
void max_heapify(int n, int H[static n], int i) {
|
||
|
while (true) {
|
||
|
int lc = left_child(i);
|
||
|
int rc = right_child(i);
|
||
|
int next = i;
|
||
|
|
||
|
if (lc < n && H[next] < H[lc]) {
|
||
|
next = lc;
|
||
|
}
|
||
|
if (rc < n && H[next] < H[rc]) {
|
||
|
next = rc;
|
||
|
}
|
||
|
if (next == i) {
|
||
|
return;
|
||
|
}
|
||
|
swap(H, i, next);
|
||
|
i = next;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void build_max_heap(int n, int H[static n]) {
|
||
|
for (int i = n / 2 - 1; i >= 0; --i) {
|
||
|
max_heapify(n, H, i);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void heapsort(int n, int H[static n]) {
|
||
|
build_max_heap(n, H);
|
||
|
while (n > 1) {
|
||
|
swap(A, 0, --n);
|
||
|
max_heapify(n, A, 0);
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Bibliography
|
||
|
|
||
|
* Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).
|