lecture 13 - mcgill cimlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106...

43
1 COMP 250 Lecture 13 mergesort, quicksort Oct. 6, 2017

Upload: others

Post on 10-Jul-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

1

COMP 250

Lecture 13

mergesort, quicksort

Oct. 6, 2017

Page 2: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

Time complexity

2

𝑂 𝑛• List operations:

findMax, remove

• grade school addition or subtraction

• …..

𝑂 𝑛2

• insertion/selection/bubble sort

• grade school multiplication

• ……

𝑂 𝑙𝑜𝑔2 𝑛• convert to binary

• binary search

• ……

Page 3: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

210 ≈ 103

220 ≈ 106

230 ≈ 109

Computers perform ~109 operations per second.

Page 4: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

𝑛

210 ≈ 103

220 ≈ 106

230 ≈ 109

𝑛2

106

1012

1018

𝑙𝑜𝑔2 𝑛

10

20

30

Computers perform ~109 operations per second.

centuriessecond

minutes…hours

Page 5: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

Better sorting algorithms ?

5

𝑂 𝑛 < ? < 𝑂( 𝑛2 )

Page 6: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

Mergesort

Given a list, partition it into two halves (1st & 2nd).

Sort each half (recursively).

Merge the two halves.

This turns out to be much faster than the other list sorting algorithms we have seen.

6

Page 7: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

7

810

311

617

16254

13

810

311

61

716

254

13

1368

1011

2457

1316

12345678

10111316

mergesort

mergesort

mergepartition

Page 8: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

8

mergesort(list){if list.length == 1

return listelse{

mid = (list.size - 1) / 2 list1 = list.getElements(0,mid)list2 = list.getElements(mid+1, list.size-1)list1 = mergesort(list1)list2 = mergesort(list2)return merge( list1, list2 )

}}

Page 9: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

9

mergesort(list){if list.length == 1

return listelse{

mid = (list.size - 1) / 2 list1 = list.getElements(0,mid)list2 = list.getElements(mid+1, list.size-1)list1 = mergesort(list1)list2 = mergesort(list2)return merge( list1, list2 )

}}

Page 10: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

10

mergesort(list){if list.length == 1

return listelse{

mid = (list.size - 1) / 2 list1 = list.getElements(0,mid)list2 = list.getElements(mid+1, list.size-1)list1 = mergesort(list1)list2 = mergesort(list2)return merge( list1, list2 )

}}

Page 11: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

11

810

311

617

16254

13

810

311

61

716

254

13

1368

1011

2457

1316

12345678

10111316

mergesort

mergesort

mergepartition

Page 12: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

12

1368

1011

2457

1316

merge

head1

head2

Page 13: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

13

1368

1011

2457

1316

1

merge

head1

head2

Page 14: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

14

1368

1011

2457

1316

12

merge

head1

head2

Page 15: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

15

1368

1011

2457

1316

123

merge

head1

head2

Page 16: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

16

1368

1011

2457

1316

1234

merge

head1

head2

Page 17: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

17

1368

1011

2457

1316

12345

merge

head1

head2

Page 18: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

18

1368

1011

2457

1316

123456

merge

head1

head2

Page 19: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

19

1368

1011

2457

1316

1234567merge

head1

head2

Page 20: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

20

1368

1011

2457

1316

123456781011

merge

head2

….and so on until one list is empty.

Page 21: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

21

1368

1011

2457

1316

1234567810111316

merge

Then, copy the remaining elements.

Page 22: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

22

merge( list1, list2){initialize list to be emptywhile (list1 is not empty) & (list2 is not empty){

if (list1.first < list2.first)list.addlast( list1.removeFirst(list1) )

elselist.addlast( list2.removeFirst(list2) )

}while list1 is not empty

list.addlast( list1.removeFirst(list1) )while list2 is not empty

list.addlast( list2.removeFirst(list2) )

return list}

Page 23: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

23

merge( list1, list2){initialize list to be emptywhile (list1 is not empty) & (list2 is not empty){

if (list1.first < list2.first)list.addlast( list1.removeFirst(list1) )

elselist.addlast( list2.removeFirst(list2) )

}while list1 is not empty

list.addlast( list1.removeFirst(list1) )while list2 is not empty

list.addlast( list2.removeFirst(list2) )

return list}

Page 24: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

810

311

617

16254

13

mergesort(list){if list.length == 1

return listelse{

mid = (list.size - 1) / 2 list1 = list.getElements(0,mid)list2 = list.getElements(mid+1, list.size-1)list1 = mergesort(list1)list2 = mergesort(list2)return merge( list1, list2 )

}}

Page 25: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

810

311

617

16254

13

810

311

61

716

254

13

list1

list2

Page 26: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

810

311

617

16254

13

810

311

61

716

254

13

810

3

1161

list1

list2

Page 27: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

810

311

617

16254

13

810

311

61

716

254

13

810

3

1161

810

3

list1

list2

Page 28: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

28

810

311

617

16254

13

810

311

61

716

254

13

810

3

1161

810

3

8

10

810

list1

list2

Page 29: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

810

311

617

16254

13

810

311

61

716

254

13

810

3

1161

810

3

8

10

810 3

810

list1

list2

Page 30: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

810

311

617

16254

13

810

311

61

716

254

13

810

3

1161

810

3

116

1

8

11

10

6

611

810

16

11

38

10list1

list2

Page 31: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

810

311

617

16254

13

810

311

61

716

254

13

810

3

1161

810

3

116

1

8

11

10

6

611

810

16

11

38

10

1368

1011

list1

list2

Page 32: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

32

810

311

617

16254

13

810

311

61

716

254

13

810

3

1161

54

716

2

810

3

116

1

716

2

54

1313

5

8

11

7

10

6

16

445

716

611

810

16

11

38

10

27

16

45

13

1368

1011

2457

1316

list1

list2

Page 33: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

33

810

311

617

16254

13

810

311

61

716

254

13

810

3

1161

54

716

2

810

3

116

1

716

2

54

1313

5

8

11

7

10

6

16

445

716

611

810

16

11

38

10

27

16

45

13

1368

1011

2457

1316

1234567810111316

Page 34: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

34

𝑙𝑜𝑔2𝑛

𝑛

Q: How many operations are required to mergesorta list of size 𝑛 ?

A: 𝑂( 𝑛 𝑙𝑜𝑔2 𝑛 )

This will become more clear a few lectures from now when we discuss recurrences.

𝑙𝑜𝑔2𝑛

𝑛

Page 35: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

𝑛

210 ≈ 103

220 ≈ 106

230 ≈ 109

𝑛2

106

1012

1018

𝑙𝑜𝑔2 𝑛

10

20

30

𝒏 𝒍𝒐𝒈𝟐 𝒏

𝟏𝟎𝟒

~𝟏𝟎𝟕

~𝟏𝟎𝟏𝟎

𝑛 𝑙𝑜𝑔2 𝑛 is much closer to 𝑛than to 𝑛2

Page 36: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

𝑛

210 ≈ 103

220 ≈ 106

230 ≈ 109

𝑛2

106

1012

1018

𝑙𝑜𝑔2 𝑛

10

20

30

Computers perform ~109 operations per second.

milliseconds minutes hours centuries

𝒏 𝒍𝒐𝒈𝟐 𝒏

𝟏𝟎𝟒

~𝟏𝟎𝟕

~𝟏𝟎𝟏𝟎

Page 37: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

37

mergesortquicksort

𝑂 𝑛 < 𝑂( 𝑛 𝑙𝑜𝑔2 𝑛) ≪ 𝑂( 𝑛2 )

bubble sortselection sortinsertion sort

Page 38: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

Quicksort

38

quicksort(list){if list.length <= 1

return listelse{

pivot = list.removeFirst() // or some other element list1 = list.getElementsLessThan(pivot)list2 = list.getElementsGreaterOrEqual(pivot)list1 = quicksort(list1)list2 = quicksort(list2)

}return concatenate( list1, e, list2 )

}

Page 39: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

Quicksort

39

quicksort(list){if list.length <= 1

return listelse{

pivot = list.removeFirst() // or some other element list1 = list.getElementsLessThan(pivot)list2 = list.getElementsGreaterOrEqual(pivot)list1 = quicksort(list1)list2 = quicksort(list2)

}return concatenate( list1, e, list2 )

}

Page 40: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

40

810

311

617

16254

13

3617254

10111613

12345678

10111316

quicksort

quicksort

partition

1234567

10111316

concatenate

pivot

Page 41: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

Quicksort can be done “in place”

41

quicksort( low, high ){if low > high

returnelse{

pivot = ___; // select index in {low, …, high} partitionIndex = makePartition (low, high, pivot)quicksort(low, partitionIndex - 1)quicksort(partionIndex + 1, high)

}}

Quicksort partitioning can be done ‘in place’ using a clever swapping and scanning technique. (See web for details, if interested.)

Page 42: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

42

810

311

617

16254

13

36172548

10111613

quicksort

quicksort

partition

12345678

10111316

pivot

Page 43: Lecture 13 - McGill CIMlanger/250/13-mergesort-slides.pdf · 2017-10-06 · 210 ≈103 220≈106 230 ≈109 2 106 1012 1018 𝑙 𝑔2 10 20 30 Computers perform ~109operations per

Mergesort vs. Quicksort

• Mergesort typically uses an extra list. More space can hurt performance for big lists.

• We will discuss worst case performance of quicksort later in the course.

• See stackoverflow if you want opinions on which is better.

43