Sắp xếp vun đống (Heapsort) dựa trên một cấu trúc dữ liệu được gọi là đống nhị phân (binary heap), gọi đơn giản là đống. Trong mục này chỉ nói về đống trong bài toán sắp xếp.
Mỗi mảng a[1..n] có thể xem như một cây nhị phân gần đầy (có trọng số là các giá trị của mảng), với gốc ở phần tử thứ nhất, con bên trái của đỉnh a[i] là a[2*i] con bên phải là a[2*i+1] (nếu mảng bắt đầu từ 1 còn nếu mảng bắt đầu từ 0 thì 2 con là a[2*i+1] và a[2*i+2] ) (nếu 2*i<=n hoặc 2*i+1<=n, khi đó các phần tử có chỉ số lớn hơn int(n/2) không có con, do đó là lá).
Việc sắp xếp lại các phần tử của một mảng ban đầu sao cho nó trở thành đống được gọi là vun đống.
Nếu hai cây con gốc 2 * i và 2 * i + 1 đã là đống thì để cây con gốc i trở thành đống chỉ việc so sánh giá trị a[i] với giá trị lớn hơn trong hai giá trị a[2 * i] và a[2 * i + 1], nếu a[i] nhỏ hơn thì đổi chỗ chúng cho nhau. Nếu đổi chỗ cho a[2 * i], tiếp tục so sánh với con lớn hơn trong hai con của nó cho đên khi hoặc gặp đỉnh lá. (Thủ tục DownHeap trong giả mã dưới đây)
Để vun mảng a[1..n] thành đống ta vun từ dưới lên, bắt đầu từ phần tử a[j]với j =Int(n/2) ngược lên tới a[1]. (Thủ tục MakeHeap trong giả mã dưới đây) kho qua
Đổi chỗ (Swap): Sau khi mảng a[1..n] đã là đống, lấy phần tử a[1] trên đỉnh của đống ra khỏi đống đặt vào vị trí cuối cùng n, và chuyển phần tử thứ cuối cùng a[n] lên đỉnh đống thì phần tử a[n] đã được đứng đúng vị trí.
Vun lại: Phần còn lại của mảng a[1..n-1] chỉ khác cấu trúc đống ở phần tử a[1]. Vun lại mảng này thành đống với n-1 phần tử.
Lặp: Tiếp tục với mảng a[1..n-1]. Quá trình dừng lại khi đống chỉ còn lại một phần tử.
Cho mảng a=(2,3,5,6,4,1,7)
Ở đây n = 7. Các phần tử từ a[4] đến a[7] là lá.
và vun lại mảng a[1..6] ta được mảng a=(6,4,5,3,2,1,7)
và vun lại mảng a[1..5] ta được mảng a=(5,4,2,3,1,6,7)
và vun lại mảng a[1..4] ta được mảng a=(4,3,2,1,5,6,7)
và vun lại mảng a[1..3] ta được mảng a=(3,1,2,4,5,6,7)
và vun lại mảng a[1..2] ta được mảng a=(2,1,3,4,5,6,7)
==Mã giả==(DowHeap)
function heapSort(a[1..count], count) { var int end := count
MakeHeap(a,count) while end > 0 swap(a[end], a[1]) end := end - 1 DownHeap(a, 1, end) } function MakeHeap(a, count) { var int start := Int(count/2)
while start > 0 DownHeap(a, start, count) start := start - 1 }
function DownHeap(a, start, count) { var int i := start, j while i * 2 <= count { j := i * 2 if j+1 <= count and a[j] < a[j + 1] j := j + 1 if a[i] < a[j] swap(a[i], a[j]) i := j else return } }
Ngoài giải thuật sắp xếp vun đống, cấu trúc đống còn được ứng dụng trong nhiều giải thuật khác, khi cần lấy ra nhanh chóng các phần tử lớn nhất (hoặc nhỏ nhất) của một dãy phần tử, chẳng hạn trong hàng đợi có ưu tiên trong đó tiêu chuẩn ưu tiên là có khóa lớn nhất (hoặc nhỏ nhất). Có thể tìm thấy điều đó trong giải thuật tìm bộ mã Huffman cho một bảng tần số của các kí tự.(tacgia )