21
1 CISC 320 Introduction to Algorithms Spring 2014 Lecture 6 Heapsort

CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

1

CISC 320 Introduction to AlgorithmsSpring 2014

Lecture 6Heapsort

Page 2: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

2

Insertion Sort

25 4 6 1 3

42 5 6 1 3

54 61 3

62 4 5 1 3

12 4 5 6 3

354 61 2

2

Page 3: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

3

void insertionSort (Element[] E, int n)for ( int i =1; i< n; i++)

Element current = E[i];Key x = current.key;int xLoc = shiftVac(E, i, x);

E[xLoc] = current;return;

int shiftVac (Element[] E, int xindex, Key x)int vacant, xLoc;vacant = xindex; xLoc = 0; // Assume x is the smallest key, and will move to the leftmost position.while(vacant > 0) { // still have elements to the left

if (E[vacant-1].key <= x) // the element to the left has smaller keyxLoc = vacant; // here is the location to insert x.break;

E[vacant] = E[vacant -1]; // switch with the left neighbor that has a larger keyvacant--; // and take your left neighbor’s position.

}return xLoc;

Page 4: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

4

Insertion Sort: complexity analysis

Worst-caseTwc(n) ≤ Σi=1to n-1 i = n(n-1)/2

for loop to see whether E[i] needs to move

while loop to move E[i] at most i times to the front of the array

Page 5: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

5

How to improve the algorithm?? How to accelerate search??? How to accelerate shift???

Is there a data structure that help achieve both?

Page 6: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

6

Heapsort

Heap: a binary tree T that satisfies1. T is complete through depth h-12. All paths to a leaf of depth h are to the left of all

paths to a leaf of depth h-1, i.e., leaves at level h are filled from left to right.

3. Key at any node is greater than or equal to the keys at each of its children (for maximizing heap). This is called heap property or partial order tree property.

Page 7: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

7

161410 8 7 9 3 2 4 11 2 3 4 5 6 7 8 9 10

└n/2┘ +1

leavesInternal nodes

16

14

8

2

10

9 3

1

7

4

1

2 3

4 5 6 7

8 109

Parent(i) = └i/2┘

Left(i) = 2i

Right(i) = 2i + 1

Page 8: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

CISC320, F03, Lec4, Liao 8

Maintain a heap

Left and right subtrees of i are already heapsMake subtree rooted at i a heapHeapify(A, i) 1 l ← left(i); // l = 2i2 r ← right(i); // r = 2i+13 if ( l ≤ n and A[l] > A[i]) 4 then largest ← l;5 else largest ← i;6 if (r ≤ n and A[r] > A[largest])7 then largest ← r;8 if (largest ≠ i)9 then exchange A[i] ↔ A[largest];10 Heapify(A, largest);

Analysis:time is proportional to height of i

∈ O(lg n)

Page 9: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

CISC320, F03, Lec4, Liao 9

Heapfy(A, 2)16

14

4

2

10

9 3

1

7

8

1

2 3

4 5 6 7

8 109

16

14

8

2

10

9 3

1

7

4

1

2 3

4 5 6 7

8 109

16

4

14

2

10

9 3

1

7

8

1

2 3

4 5 6 7

8 109

a. Exchange A[2] with A[4] and recursively call heapify(A,4)

b. Exchange A[4] with A[9] and recursively call heapify(A, 9)

c. Node 9 has no children, so it is done.

a

c

b

Page 10: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

CISC320, F03, Lec4, Liao 10

Construct a Heap Convert an array A[1..n] into a heap Elements from n/2 +1 to n correspond to leaves,

and themselves are 1-element heaps already.

constructHeap(A) 1. For (i= floor(n/2); i > 1; i--)2. heapify(A, i);

Page 11: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

CISC320, F03, Lec4, Liao 11

c

4

1

2

14

3

9 10

7

16

8

1

2 3

4 5 6 7

8 109

4

1

2

14

3

9 10

7

16

8

1

2 3

4 5 6 7

8 109

4

1

2

14

3

9 10

7

16

8

1

2 3

4 5 6 7

8 109

i

4

1

2

14

3

9 10

7

16

8

1

2 3

4 5 6 7

8 109

4

1

2

14

3

9 10

7

16

8

1

2 3

4 5 6 7

8 109

i

4

1

14

2

3

9 10

7

16

8

1

2 3

4 5 6 7

8 109

4

1

14

2

3

9 10

7

16

8

1

2 3

4 5 6 7

8 109

4

1

14

2

10

9 3

7

16

8

1

2 3

4 5 6 7

8 109

4

1

14

2

10

9 3

7

16

8

1

2 3

4 5 6 7

8 109

i

i i

4 1 3 2 16 9 1014 8 71 2 3 4 5 6 7 8 9 10

A

ab

d

Page 12: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

12

4

16

14

2

10

9 3

1

7

8

1

2 3

4 5 6 7

8 109

i 16

14

8

2

10

9 3

1

7

4

1

2 3

4 5 6 7

8 109

e f

Page 13: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

13

Analysis of constructHeapn calls to heapify = n O(lg n) = O(n lg n)

A tighter analysisT(n) = T(n-r-1) + T(r) + 2 lg(n)

= 2T((n-1)/2) + 2 lg(n) // complete binary tree

you can prove that Θ(n)

heapifyright subtreeleft subtree

Page 14: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

14

HeapsortHeapsort(A)int heapsize = n;

1. constructHeap(A); // O(n)2. for(i = heapsize; i > 2; i--) // n3. do exchange A[1] ↔ A[i]; // O(1)4. heapsize = heapsize – 1; // O(1)5. Heapify(A, 1); // O(lg n)

Time analysis:T(n) = O(n) + O(n lg n) = O(n lg n)

i

sortedheap

1 nLargest key in the heap

Page 15: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

15

A more exact analysisT(n) = Θ(n) + 2 ∑ i=1 to n-1 └lg i┘

≤ Θ(n) + 2 ∫1 n (lg e) ln x dx= Θ(n) + 2 (lg e) (n ln n – n)= Θ(n) + 2(n lg(n) – 1.443 n)= 2 n lg(n) + O(n)

Page 16: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

16

Heap-extract-max(A)1. If heap-size(A) < 1 2. then error “heap underflow”3. max = A[1];4. A[1] = A[heap-size(A)]5. Heap-size(A) = heap-size(A) -16. Heapify(A, 1)7. Return max;

Note: Heap-extract-max takes only O(lg n) time

Page 17: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

17

Heap-insert(A, key)1. heap-size(A) = heap-size(A) + 12. i = heap-size(A)3. while (i > 1 and A[parent(i)] < key)4. A[i] = A[parent(i)]5. i = parent(i) 6. A[i] = key

Note: this is bubble-up heap, only requires one comparison at each level to float a big key to its right position (in contrast to heapify which requires two comparisons to filter down a small key)

Page 18: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

18

Heap-insert(A, 15)

16

14

8

2

10

9 3

1

7

4

1

2 3

4 5 6 7

8 109

16

14

8

2

10

9 3

1

7

4

1

2 3

4 5 6 7

8 109

16

8

2

10

9 3

1

14

4

1

2 3

4 5 6 7

8 1097

16

15

8

2

10

9 3

1

14

4

1

2 3

4 5 6 7

8 1097

Page 19: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

19

Comparison of sorting algorithms

Algorithm Worst-case Average Space usageInsertionsort n2/2 Θ(n2) in placeQuicksort n2/2 Θ(n log n) extra space log nMergesort n lg n Θ(n log n) extra space nHeapsort 2n lg n Θ(n log n) in place

Page 20: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

20

Lower bounds: worst-case

Decision tree approachnodes ↔ comparisons of keysleaves ↔ possible permutation of n keys (=n!)

Height ↔ max # of comparisons≥ lg (# of leaves) = lg(n!)≥ (n/2)lg(n/2)∈Θ(n log n)

i:j

xi<xjxi>xj

xi xj xj xi

Page 21: CISC 320 Introduction to Algorithms Spring 2014yu/Teaching/CISC320_S14/handouts/lec6.pdfInsertion Sort 5 2 46 13 254 61 3 13465 2456 13 24561 3 12465 3 2. 3 ... Insertion Sort: complexity

21

Lower bounds Theorem 4.10 Any algorithms to sort n items by

comparisons of keys must do at lease ┌lg(n!)┐, or approximately ┌ n lg n – 1.443n┐, key comparisons in the worst case. Mergesort is optimal for the worst case.

Average-Case Tav(n) = (sum of lengths of all paths from the root to a leaf) /

(L, # of leaves) Balanced decision tree => lower Tav(n) A complete tree is most balanced: [L lg(L)] /L Therefore,

Tav(n) ≥ lg(L) = lg(n!) Θ(n log n)