lecture 3 heap sort and quick sort - umass amherst 241 f19 lecture 3.pdf · lecture 3 heap sort and...
TRANSCRIPT
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Objective
• Learnhowperformance ofMergesortcanbefurther improvedbyusingHeapsortandQuicksort
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Heap Sort
3
• Use“heap”datastructure tomanageinformation
• Makesalsoanefficientpriorityqueue (morelaterinthesemester)
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Binary Heap
4
8
4
2 4
8 9
14
2
7
5
1
10
9
610
3
3
7
16
1
16
1
14
2
10
3
8
4
7
5
9
6
3
7
2
8
4
9
1
10
ValueIndex
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Binary Heap
5
• Represent treeassinglelist:• Root oftreeisA[1],withindexi ofnode
• PARENT(i)return ⌊i/2⌋
• Left(i)return 2i
• Right(i)return 2i +1
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Max-heap
6
• A[PARENT(i)] ≥ A[i]:Valueofnode i isatmostvalueofitsparent
• Largestvaluestoredatroot• Subtreerootedatnodecontainsnovalueslagerthanvalueofnodeitself
• UsedforHeapsort
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Min-Heap
7
• A[PARENT(i)] ≤ A[i]• Smallestvaluestoredatroot• Subtreerootedatnodecontainsnovaluessmallerthanvalueofnodeitself
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Max-Heapify
8
14
4
2 8
8 9
4
2
7
5
1
10
9
610
3
3
7
16
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Max-Heapify
9
4
4
2 8
8 9
14
2
7
5
1
10
9
610
3
3
7
16
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Max-Heapify
10
8
4
2 4
8 9
14
2
7
5
1
10
9
610
3
3
7
16
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Max-Heapify
11
Max-Heapify(A,i)1 l ⃪ LEFT(i)
2 r ⃪ RIGHT(i)
3 ifl≤ heap-size[A]andA[l]>A[i]
4 thenlargest⃪ l
5 elselargest⃪ i
6 ifr≤ heap-size[A]andA[r]>A[largest]
7 thenlargest⃪ r
8 iflargest≠i
9 thenexchangeA[i]⟷ A[largest]
10 MAX-HEAPIFY(A,largest)
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Building a Heap
12
Build-Max-Heap(A) 1 heap-size[A]⃪ length[A]
2 forI⃪ ⌊length[A]/2⌋ downto 1
3 doMAX-HEAPIFY(A,i)
4 1 3 2 16 9 10 14 8 7
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Building a Heap: Example
13
2
4
14 8
8 9
1
2
16
5
7
10
9
63
3
10
7
4
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Building a Heap: Example
14
2
4
14 8
8 9
1
2
16
5
7
10
9
63
3
10
7
4
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Building a Heap: Example
15
14
4
2 8
8 9
1
2
16
5
7
10
9
63
3
10
7
4
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Building a Heap: Example
16
14
4
2 8
8 9
1
2
16
5
7
10
9
610
3
3
7
4
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Building a Heap: Example
17
14
4
2 8
8 9
16
2
7
5
1
10
9
610
3
3
7
4
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Building a Heap: Example
18
8
4
2 4
8 9
14
2
7
5
1
10
9
610
3
3
7
16
1
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Heapsort Algorithm
19
HeapSort(A) 1 BUILD-MAX-HEAP(A)
2 fori ⃪ length[A]downto 2
3 doexchangeA[1]⟷ A[i]
4 heap-size[A]⃪ heap-size[A]– 1
5 MAX-HEAPIFY(A,1)
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Heapsort Algorithm: Example (i)
20
8
4
2 4
8 9
14
2
7
5
1
10
9
610
3
3
7
16
1
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Heapsort Algorithm: Example (ii)
21
4
4
2 1
8 9
8
2
7
5
16
10
9
610
3
3
7
14
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Heapsort Algorithm: Example (iii)
22
4
4
2 14
8 9
8
2
7
5
16
10
1
69
3
3
7
10
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Heapsort Algorithm: Example (iv)
23
4
4
10 14
8 9
8
2
7
5
16
10
1
63
3
2
7
9
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Heapsort Algorithm: Example (v)
24
4
4
10 14
8 9
7
2
2
5
16
10
1
63
3
9
7
8
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Heapsort Algorithm: Example (vi)
25
1
4
10 14
8 9
4
2
2
5
16
10
8
63
3
9
7
7
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Heapsort Algorithm: Example (vii)
26
1
4
10 14
8 9
2
2
7
5
16
10
8
63
3
9
7
4
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Heapsort Algorithm: Example (viii)
27
4
4
10 14
8 9
2
2
7
5
16
10
8
61
3
9
7
3
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Heapsort Algorithm: Example (iv)
28
4
4
10 14
8 9
1
2
7
5
16
10
8
63
3
9
7
2
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Heapsort Algorithm: Example (x)
29
4
4
10 14
8 9
2
2
7
5
16
10
8
63
3
9
7
2
1
i
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Heapsort – Analysis
30
• Heapsort takestimeO(nlogn)• BUILD-MAX-HEAP takestimeO(n)• MAX-HEAPIFY takestimeO(logn)
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Quick Sort
31
• UsesdivideandconquerasinMergeSort• NoADDITIONAL storageusage=>overcomesMergeSortweakness
• Trade-off: Performance diminished iflistcanbedividedinhalf
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Quick Sort – Pivot Value
32
1. SelectPivotValue:• Simplyfirstiteminlist
• Assistwithsplittinglist• Splitpoint usedtodividelistforsubsequent calls
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Quick Sort – Partitioning
33
2. Partitioning:• Setleftmark andrightmark
• Moveitemsto”right”sideofpivotvalue
• Convergesplitpoint
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Quick Sort – Exchange Pivot
34
3. ExchangePivot:• Stopwhenrightmark <=leftmark• Moveitemsto”right”sideofpivotvalue• Convergesplitpoint• QuickSortforleft- andrighthalf
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Quick Sort – Implementation
35
def quickSort(alist):quickSortHelper(alist,0,len(alist)-1)
def quickSortHelper(alist,first,last):if first<last:
splitpoint = partition(alist,first,last)
quickSortHelper(alist,first,splitpoint-1)quickSortHelper(alist,splitpoint+1,last)
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Quick Sort – Implementation
36
def partition(alist,first,last):pivotvalue = alist[first]
leftmark = first+1rightmark = last
done = Falsewhile not done:
while leftmark <= rightmark and alist[leftmark] <= pivotvalue: leftmark = leftmark + 1
while alist[rightmark] >= pivotvalue and rightmark >= leftmark:rightmark = rightmark -1
if rightmark < leftmark: done = True else: temp = alist[leftmark]
alist[leftmark] = alist[rightmark]alist[rightmark] = temp
temp = alist[first]alist[first] = alist[rightmark]alist[rightmark] = temp
return rightmark
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Quick Sort – Implementation
37
alist = [54,26,93,17,77,31,44,55,20]quickSort(alist)print(alist)
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Quick Sort – Analysis
38
• logndivisions, ifpartitionsoccuralwaysinmiddleoflist
• nitemstocheckagainstpivotvaluetofindsplitpoint• =>nlogn• Noadditionalmemory requirements
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Quick Sort – Analysis (Worst Case)
39
• Splitpointsnotinthemiddle,skewed toleftorright• =>sortingalistof0andn-1 items,then0andn-2,andsoon
• Results inO(n2)plusoverhead requiredbyrecursion• Medianofthethree:pivotvalueismedianvalueoffirst,middle,andlastelement=>chooseabetter“middlevalue”
ECE 241 – Adv. Programming I Fall 2019 © 2019 Mike Zink
Next Steps
40
• NextlectureonThursday• DiscussiononThursday• Homework1dueonThursday at11PM