Post on 02-Jan-2016
description
BuildHeap: Is this a proper heap?
12
5
4
7
68 3
9 11 10 2
Are any of the subtrees guaranteed to be proper heaps?
012
17
25
38
43
56
64
79
811
910
102
BuildHeap: Leaves are proper heaps
12
5
4
7
68 3
9 11 10 2
012
17
25
38
43
56
64
79
811
910
102
Size = 11Size/2 – 1 = 4
11
First non-leaf
BuildHeap
• How can we use this information to build a heap from a random array?
• _adjustHeap: takes a binary tree, rooted at a node, where all subtrees of that node are proper heaps and percolates down from that node to ensure that it is a proper heap
void _adjustHeap(struct DynArr *heap,int max, int pos)
Adjust up to(not inclusive) Adjust from
BuildHeap
• Find the last non-leaf node,i, (going from left to right)
• adjust heap from it to max• Decrement i and repeat until you process the
root
HeapSort
• BuildHeap and _adjustHeap are the keys to an efficient , in-place, sorting algorithm
• in-place means that we don’t require any extra storage for the algorithm
• Any ideas???
HeapSort
1. BuildHeap – turn arbitrary array into a heap
2. Swap first and last elements
3. Adjust Heap (from 0 to the last…not inclusive!)
4. Repeat 2-3 but decrement last each time through
HeapSort Simulation: BuildHeap
09
13
28
34
45
57
Max = 6i=Max/2 – 1 = 2
9
83
74 5
i=2_adjustHeap(heap,6,2)
HeapSort Simulation: BuildHeap
03
14
27
39
45
58
3
74
89 5
i=-1Done…with BuildHeap ….now let’s sort it!
HeapSort
1. BuildHeap
2. Swap first and last
3. Adjust Heap (from 0 to the last)
4. Repeat 2-3 but decrement last
HeapSort Simulation: Sort in Place
03
14
27
39
45
58
3
74
89 5
i=5 Swap(v, 0, i)_adjustHeap(v, i, 0);
Iteration 1
HeapSort Simulation: Sort in Place
08
14
27
39
45
53
8
74
39 5
i=5Swap(v, 0, i)_adjustHeap(v, i, 0);
Iteration 1
HeapSort Simulation: Sort in Place
04
15
27
39
48
53
4
75
39 8
i=4Swap(v, 0, i)_adjustHeap(v, i, 0);
Iteration 2
HeapSort Simulation: Sort in Place
08
15
27
39
44
53
8
75
39 4
i=4Swap(v, 0, i)_adjustHeap(v, i, 0);
Iteration 2
HeapSort Simulation: Sort in Place
05
18
27
39
44
53
5
78
39 4
i=3Swap(v, 0, i)_adjustHeap(v, i, 0);
Iteration 3
HeapSort Simulation: Sort in Place
09
18
27
35
44
53
9
78
35 4
i=3Swap(v, 0, i)_adjustHeap(v, i, 0);
Iteration 3
HeapSort Simulation: Sort in Place
07
18
29
35
44
53
7
98
35 4
i=2Swap(v, 0, i)_adjustHeap(v, i, 0);
Iteration 4
HeapSort Simulation: Sort in Place
09
18
27
35
44
53
9
78
35 4
i=2Swap(v, 0, i)_adjustHeap(v, i, 0);
Iteration 4
HeapSort Simulation: Sort in Place
08
19
27
35
44
53
8
79
35 4
i=1Swap(v, 0, i)_adjustHeap(v, i, 0);
Iteration 5
HeapSort Simulation: Sort in Place
09
18
27
35
44
53
9
78
35 4
i=1Swap(v, 0, i)_adjustHeap(v, i, 0);
Iteration 5
HeapSort Performance
• Build Heap:
n/2 calls to _adjustHeap = O(n log n)
• HeapSort:
n calls to swap and adjust = O(n log n)
• Total:
O(n log n)