Heap sort is een vergelijkingsgebaseerde sorteertechniek gebaseerd op Binary Heap datastructuur. Het is vergelijkbaar met selection sort waar we eerst het maximum element vinden en het maximum element aan het eind plaatsen. We herhalen hetzelfde proces voor de resterende elementen.
Wat is Binary Heap?
Laten we eerst een complete binaire boom definiëren. Een complete binaire boom is een binaire boom waarin elk niveau, behalve mogelijk het laatste, volledig is gevuld, en alle knooppunten zo ver mogelijk naar links staan (Bron Wikipedia)
Een binaire hoop is een complete binaire boom waarin items zijn opgeslagen in een speciale volgorde, zodanig dat de waarde in een ouder knooppunt groter (of kleiner) is dan de waarden in zijn twee kinderen knooppunten. De eerste wordt max-heap genoemd en de tweede min-heap. De heap kan worden gerepresenteerd door een binaire boom of een array.
Waarom een array-gebaseerde representatie voor Binary Heap?
Omdat een binaire hoop een complete binaire boom is, kan hij gemakkelijk worden weergegeven als een matrix en de op een matrix gebaseerde weergave is ruimte-efficiënt. Als de ouder node is opgeslagen op index I, kan het linker kind worden berekend door 2 * I + 1 en het rechter kind door 2 * I + 2 (ervan uitgaande dat de indexering begint bij 0).
Heap Sort Algoritme voor sorteren in oplopende volgorde:
1. Bouw een max heap van de invoergegevens.
2. Op dit punt wordt het grootste item opgeslagen aan de wortel van de hoop. Vervang het door het laatste item van de heap, gevolgd door het verkleinen van de heap met 1. Tot slot, heap de wortel van de boom.
3. Herhaal stap 2 zolang de grootte van de heap groter is dan 1.
Hoe bouw je de heap op?
De heapify procedure kan alleen op een knoop worden toegepast als zijn kinderen ook geheapificeerd zijn. Dus de heapificatie moet worden uitgevoerd in de volgorde van onder naar boven.
Laten we dit begrijpen met behulp van een voorbeeld:
Input data: 4, 10, 3, 5, 1 4(0) / \ 10(1) 3(2) / \ 5(3) 1(4)The numbers in bracket represent the indices in the array representation of data.Applying heapify procedure to index 1: 4(0) / \ 10(1) 3(2) / \5(3) 1(4)Applying heapify procedure to index 0: 10(0) / \ 5(1) 3(2) / \ 4(3) 1(4)The heapify procedure calls itself recursively to build heap in top down manner.
#include <iostream>
using
namespace
std;
void
heapify(
int
arr,
int
n,
int
i)
{
int
largest = i;
int
l = 2 * i + 1;
int
r = 2 * i + 2;
if
(l < n && arr > arr)
largest = l;
if
(r < n && arr > arr)
largest = r;
if
(largest != i) {
swap(arr, arr);
heapify(arr, n, largest);
}
}
void
heapSort(
int
arr,
int
n)
{
for
(
int
i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
for
(
int
i = n - 1; i > 0; i--) {
swap(arr, arr);
heapify(arr, i, 0);
}
}
void
printArray(
int
arr,
int
n)
{
for
(
int
i = 0; i < n; ++i)
cout << arr <<
" "
;
cout <<
"\n"
;
}
int
main()
{
int
arr = { 12, 11, 13, 5, 6, 7 };
int
n =
sizeof
(arr) /
sizeof
(arr);
heapSort(arr, n);
cout <<
"Sorted array is \n"
;
printArray(arr, n);
}
public
class
HeapSort {
public
void
sort(
int
arr)
{
int
n = arr.length;
for
(
int
i = n /
2
-
1
; i >=
0
; i--)
heapify(arr, n, i);
for
(
int
i = n -
1
; i >
0
; i--) {
int
temp = arr;
arr = arr;
arr = temp;
heapify(arr, i,
0
);
}
}
void
heapify(
int
arr,
int
n,
int
i)
{
int
largest = i;
int
l =
2
* i +
1
;
int
r =
2
* i +
2
;
if
(l < n && arr > arr)
largest = l;
if
(r < n && arr > arr)
largest = r;
if
(largest != i) {
int
swap = arr;
arr = arr;
arr = swap;
heapify(arr, n, largest);
}
}
static
void
printArray(
int
arr)
{
int
n = arr.length;
for
(
int
i =
0
; i < n; ++i)
System.out.print(arr +
" "
);
System.out.println();
}
public
static
void
main(String args)
{
int
arr = {
12
,
11
,
13
,
5
,
6
,
7
};
int
n = arr.length;
HeapSort ob =
new
HeapSort();
ob.sort(arr);
System.out.println(
"Sorted array is"
);
printArray(arr);
}
}
def
heapify(arr, n, i):
largest
=
i
l
=
2
*
i
+
1
r
=
2
*
i
+
2
if
l < n
and
arr < arr:
largest
=
l
if
r < n
and
arr < arr:
largest
=
r
if
largest !
=
i:
arr, arr
=
arr, arr
heapify(arr, n, largest)
def
heapSort(arr):
n
=
len
(arr)
for
i
in
range
(n
/
/
2
-
1
,
-
1
,
-
1
):
heapify(arr, n, i)
for
i
in
range
(n
-
1
,
0
,
-
1
):
arr, arr
=
arr, arr
heapify(arr, i,
0
)
arr
=
heapSort(arr)
n
=
len
(arr)
print
(
"Sorted array is"
)
for
i
in
range
(n):
print
(
"%d"
%
arr),
using
System;
public
class
HeapSort {
public
void
sort(
int
arr)
{
int
n = arr.Length;
for
(
int
i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
for
(
int
i = n - 1; i > 0; i--) {
int
temp = arr;
arr = arr;
arr = temp;
heapify(arr, i, 0);
}
}
void
heapify(
int
arr,
int
n,
int
i)
{
int
largest = i;
int
l = 2 * i + 1;
int
r = 2 * i + 2;
if
(l < n && arr > arr)
largest = l;
if
(r < n && arr > arr)
largest = r;
if
(largest != i) {
int
swap = arr;
arr = arr;
arr = swap;
heapify(arr, n, largest);
}
}
static
void
printArray(
int
arr)
{
int
n = arr.Length;
for
(
int
i = 0; i < n; ++i)
Console.Write(arr +
" "
);
Console.Read();
}
public
static
void
Main()
{
int
arr = { 12, 11, 13, 5, 6, 7 };
int
n = arr.Length;
HeapSort ob =
new
HeapSort();
ob.sort(arr);
Console.WriteLine(
"Sorted array is"
);
printArray(arr);
}
}
<?php
function
heapify(&
$arr
,
$n
,
$i
)
{
$largest
=
$i
;
$l
= 2*
$i
+ 1;
$r
= 2*
$i
+ 2;
if
(
$l
<
$n
&&
$arr
>
$arr
)
$largest
=
$l
;
if
(
$r
<
$n
&&
$arr
>
$arr
)
$largest
=
$r
;
if
(
$largest
!=
$i
)
{
$swap
=
$arr
;
$arr
=
$arr
;
$arr
=
$swap
;
heapify(
$arr
,
$n
,
$largest
);
}
}
function
heapSort(&
$arr
,
$n
)
{
for
(
$i
=
$n
/ 2 - 1;
$i
>= 0;
$i
--)
heapify(
$arr
,
$n
,
$i
);
for
(
$i
=
$n
-1;
$i
> 0;
$i
--)
{
$temp
=
$arr
;
$arr
=
$arr
;
$arr
=
$temp
;
heapify(
$arr
,
$i
, 0);
}
}
function
printArray(&
$arr
,
$n
)
{
for
(
$i
= 0;
$i
<
$n
; ++
$i
)
echo
(
$arr
.
" "
) ;
}
$arr
=
array
(12, 11, 13, 5, 6, 7);
$n
= sizeof(
$arr
)/sizeof(
$arr
);
heapSort(
$arr
,
$n
);
echo
'Sorted array is '
.
"\n"
;
printArray(
$arr
,
$n
);
?>
Sorted array is 5 6 7 11 12 13
Hier is eerdere C code ter referentie.
Noten:
Heap sort is een in-place algoritme.
De typische implementatie is niet stabiel, maar kan stabiel gemaakt worden (Zie dit)
Tijd complexiteit: Tijdscomplexiteit van heapify is O(Logn). Tijdscomplexiteit van createAndBuildHeap() is O(n) en de totale tijdscomplexiteit van Heap Sort is O(nLogn).
Toepassingen van HeapSort
1. Een bijna gesorteerde (of K gesorteerde) array sorteren
2. k grootste (of kleinste) elementen in een array
Heap sort algoritme heeft beperkte toepassingen omdat Quicksort en Mergesort in de praktijk beter zijn. Niettemin wordt de Heap datastructuur zelf enorm veel gebruikt. Zie Toepassingen van Heap datastructuur
https://youtu.be/MtQL_ll5KhQ
Snapshots:
Quiz over Heap Sort
Andere sorteeralgoritmen op GeeksforGeeks/GeeksQuiz:
QuickSort, Selection Sort, Bubble Sort, Insertion Sort, Merge Sort, Heap Sort, QuickSort, Radix Sort, Counting Sort, Bucket Sort, ShellSort, Comb Sort, Pigeonhole Sort
Coding practice voor sorteren.