Rowan Merewood
June 08, 2013
3.7k

# Algorithms - Sorting & Searching

Overview and visualisation of some sorting and searching algorithms.

June 08, 2013

## Transcript

3. ### WHO AM I? Software Engineer and Technical Team Lead \$

i n v i q a G r o u p = [ ' I n v i q a ' , ' S e n s i o L a b s U K ' , ' S e s s i o n D i g i t a l ' ] ; \$ s o c i a l = [ ' b l o g ' = > ' h t t p : / / m e r e w o o d . o r g ' , ' f a c e b o o k ' = > \$ t h i s - > g r a p h S e a r c h ( ' p e o p l e i a m s t a l k i n g ' ) , ' g i t h u b ' = > ' h t t p s : / / g i t h u b . c o m / r o w a n - m ' , ' g o o g l e + ' = > ' h t t p s : / / p l u s . g o o g l e . c o m / 1 1 1 8 1 3 8 4 5 7 2 7 0 0 5 1 6 0 1 6 4 ' , ' i d e n t i c a ' = > ' h t t p : / / i d e n t i . c a / r o w a n m ' , ' i m d b ' = > ' h t t p : / / i m d b . c o m / n a m e / n m 1 4 1 2 3 4 8 ' , ' t w i t t e r ' = > ' h t t p s : / / t w i t t e r . c o m / r o w a n _ m ' , ] ;
4. ### WHY AM I HERE? 1. Because straight-up, pure computer science

is AWESOME. Also, understanding the lower level detail helps you make better use of the higher level abstractions. 2. ^ E O F
5. ### WHY SORT? Displaying lists to humans Categorising data Preparing data

for merging Preparing data for searching In general: to display or to prepare for another operation.

7. ### STABLE UNSTABLE Order of unsorted portion maintained Order of unsorted

portion may change STABILITY 4 : A 1 : A 1 : B 3 : A 2 : A 3 : B 2 : B 2 : C 1 1 : A 1 : B 2 : A 2 : B 2 : C 3 : A 3 : B 4 : B 2 4 : A 1 : A 1 : B 3 : A 2 : A 3 : B 2 : B 2 : C 1 1 : B 1 : A 2 : C 2 : B 2 : A 3 : A 3 : B 4 : B 2 1 : A 1 : B 2 : A 2 : B 2 : C 3 : A 3 : B 4 : B 3
8. ### BIG O NOTATION Rate of growth for resource usage based

on the size of its input. Resource usage: CPU cycles / time, memory usage Size of input: number of elements
9. ### BIG O NOTATION (CONT.) Ο(1): Constant Ο(n): Linear growth Ο(n

log n): Logarithmic growth Ο(n2): Quadratic growth

12. ### INSERTION SORT CODE c l a s s I n

s e r t i o n S o r t { p u b l i c f u n c t i o n s o r t ( a r r a y \$ e l e m e n t s ) { \$ i t e r a t i o n s = c o u n t ( \$ e l e m e n t s ) ; f o r ( \$ i n d e x = 1 ; \$ i n d e x < \$ i t e r a t i o n s ; \$ i n d e x + + ) { \$ e l e m e n t T o I n s e r t = \$ e l e m e n t s [ \$ i n d e x ] ; \$ i n s e r t I n d e x = \$ i n d e x ; w h i l e ( \$ i n s e r t I n d e x > 0 & & \$ e l e m e n t T o I n s e r t < \$ e l e m e n t s [ \$ i n s e r t I n d e x - 1 ] ) { \$ e l e m e n t s [ \$ i n s e r t I n d e x ] = \$ e l e m e n t s [ \$ i n s e r t I n d e x - 1 ] ; \$ e l e m e n t s [ \$ i n s e r t I n d e x - 1 ] = \$ e l e m e n t T o I n s e r t ; \$ i n s e r t I n d e x - - ; } } r e t u r n \$ e l e m e n t s ; } }
13. ### INSERTION SORT (CONT.) CODE: ITERATE THROUGH THE LIST p u

b l i c f u n c t i o n s o r t ( a r r a y \$ e l e m e n t s ) { / / A t l e a s t o n e i t e r a t i o n p e r e l e m e n t \$ i t e r a t i o n s = c o u n t ( \$ e l e m e n t s ) ; f o r ( \$ i n d e x = 1 ; \$ i n d e x < \$ i t e r a t i o n s ; \$ i n d e x + + ) { / / I f n o o t h e r v a r i a b l e o p e r a t i o n s h a p p e n h e r e : / / a l g o r i t h m i s O ( n ) } }
14. ### INSERTION SORT (CONT.) CODE: COMPARE ELEMENTS If the list is

in order, the w h i l e loop is not entered. f o r ( \$ i n d e x = 1 ; \$ i n d e x < \$ i t e r a t i o n s ; \$ i n d e x + + ) { / / " P i c k u p " t h e c u r r e n t e l e m e n t a n d i t s p o s i t i o n \$ e l e m e n t T o I n s e r t = \$ e l e m e n t s [ \$ i n d e x ] ; \$ i n s e r t I n d e x = \$ i n d e x ; / / I t e r a t e b a c k t h r o u g h t h e e l e m e n t s / / u n t i l t h e c o r r e c t p o s i t i o n i t r e a c h e d w h i l e ( \$ i n s e r t I n d e x > 0 & & \$ e l e m e n t T o I n s e r t < \$ e l e m e n t s [ \$ i n s e r t I n d e x - 1 ] ) { / / S w a p o u t o f o r d e r e l e m e n t s \$ e l e m e n t s [ \$ i n s e r t I n d e x ] = \$ e l e m e n t s [ \$ i n s e r t I n d e x - 1 ] ; \$ e l e m e n t s [ \$ i n s e r t I n d e x - 1 ] = \$ e l e m e n t T o I n s e r t ; \$ i n s e r t I n d e x - - ; } }
15. ### INSERTION SORT (CONT.) ITERATIONS 8 8 6 4 1 4

6 1 1 6 1 8 9 3 0 1 8 6 5 3 1 8 8 ↪ 6 4 1 4 6 1 1 6 1 8 9 3 0 1 8 6 5 3 2 ↪ 6 4 ⇅ 8 8 ⇅ 1 4 6 1 1 6 1 8 9 3 0 1 8 6 5 3 3 6 4 8 8 ↪ 1 4 6 1 1 6 1 8 9 3 0 1 8 6 5 3 4 6 4 8 8 1 4 6 ↪ 1 1 6 1 8 9 3 0 1 8 6 5 3 5 6 4 8 8 ↪ 1 1 6 ⇅ 1 4 6 ⇅ 1 8 9 3 0 1 8 6 5 3 6 6 4 8 8 1 1 6 1 4 6 ↪ 1 8 9 3 0 1 8 6 5 3 7
16. ### 6 4 8 8 1 1 6 1 4 6

1 8 9 ↪ 3 0 1 8 6 5 3 8 6 4 8 8 1 1 6 1 4 6 ↪ 3 0 ⇅ 1 8 9 ⇅ 1 8 6 5 3 9 6 4 8 8 1 1 6 ↪ 3 0 ⇅ 1 4 6 ⇅ 1 8 9 1 8 6 5 3 1 0 6 4 8 8 ↪ 3 0 ⇅ 1 1 6 ⇅ 1 4 6 1 8 9 1 8 6 5 3 1 1 6 4 ↪ 3 0 ⇅ 8 8 ⇅ 1 1 6 1 4 6 1 8 9 1 8 6 5 3 1 2 ↪ 3 0 ⇅ 6 4 ⇅ 8 8 1 1 6 1 4 6 1 8 9 1 8 6 5 3 1 3 3 0 6 4 8 8 1 1 6 1 4 6 1 8 9 ↪ 1 8 6 5 3 1 4 3 0 6 4 8 8 1 1 6 1 4 6 ↪ 1 8 6 ⇅ 1 8 9 ⇅ 5 3 1 5 3 0 6 4 8 8 1 1 6 1 4 6 1 8 6 1 8 9 ↪ 5 3 1 6 3 0 6 4 8 8 1 1 6 1 4 6 1 8 6 ↪ 5 3 ⇅ 1 8 9 ⇅ 1 7 3 0 6 4 8 8 1 1 6 1 4 6 ↪ 5 3 ⇅ 1 8 6 ⇅ 1 8 9 1 8 3 0 6 4 8 8 1 1 6 ↪ 5 3 ⇅ 1 4 6 ⇅ 1 8 6 1 8 9 1 9 3 0 6 4 8 8 ↪ 5 3 ⇅ 1 1 6 ⇅ 1 4 6 1 8 6 1 8 9 2 0 3 0 6 4 ↪ 5 3 ⇅ 8 8 ⇅ 1 1 6 1 4 6 1 8 6 1 8 9 2 1
17. ### Sorted! 3 0 ↪ 5 3 ⇅ 6 4 ⇅

8 8 1 1 6 1 4 6 1 8 6 1 8 9 2 2 3 0 ↪ 5 3 6 4 8 8 1 1 6 1 4 6 1 8 6 1 8 9 2 3
18. ### INSERTION SORT (CONT.) SUMMARY Best case: Ο(n) Average / worst

case: Ο(n2) Memory usage: Ο(n) Adaptive, stable, in place, and on line(n)
19. ### BUBBLE SORT CODE c l a s s B u

b b l e S o r t { p u b l i c f u n c t i o n s o r t ( a r r a y \$ e l e m e n t s ) { f o r ( \$ i n d e x = c o u n t ( \$ e l e m e n t s ) ; \$ i n d e x > 0 ; \$ i n d e x - - ) { \$ s w a p p e d = f a l s e ; f o r ( \$ s w a p I n d e x = 0 ; \$ s w a p I n d e x < \$ i n d e x - 1 ; \$ s w a p I n d e x + + ) { i f ( \$ e l e m e n t s [ \$ s w a p I n d e x ] > \$ e l e m e n t s [ \$ s w a p I n d e x + 1 ] ) { \$ t m p = \$ e l e m e n t s [ \$ s w a p I n d e x ] ; \$ e l e m e n t s [ \$ s w a p I n d e x ] = \$ e l e m e n t s [ \$ s w a p I n d e x + 1 ] ; \$ e l e m e n t s [ \$ s w a p I n d e x + 1 ] = \$ t m p ; \$ s w a p p e d = t r u e ; } } i f ( ! \$ s w a p p e d ) { r e t u r n \$ e l e m e n t s ; } } } }
20. ### BUBBLE SORT (CONT.) CODE: ITERATE THROUGH THE LIST / /

I t e r a t e t h r o u g h t h e e l e m e n t s f o r ( \$ i n d e x = c o u n t ( \$ e l e m e n t s ) ; \$ i n d e x > 0 ; \$ i n d e x - - ) { \$ s w a p p e d = f a l s e ; / / S w a p o u t o f o r d e r e l e m e n t s / / u n t i l t h e r e ' s n o t h i n g l e f t t o s w a p i f ( ! \$ s w a p p e d ) { r e t u r n \$ e l e m e n t s ; } }
21. ### BUBBLE SORT (CONT.) CODE If the list is in order,

then \$ s w a p p e d stays f a l s e . f o r ( \$ i n d e x = c o u n t ( \$ e l e m e n t s ) ; \$ i n d e x > 0 ; \$ i n d e x - - ) { \$ s w a p p e d = f a l s e ; / / I t e r a t e t h r o u g h t h e u n s o r t e d p o r t i o n o f t h e l i s t f o r ( \$ s w a p I n d e x = 0 ; \$ s w a p I n d e x < \$ i n d e x - 1 ; \$ s w a p I n d e x + + ) { / / C o m p a r e a n d s w a p e l e m e n t s i f ( \$ e l e m e n t s [ \$ s w a p I n d e x ] > \$ e l e m e n t s [ \$ s w a p I n d e x + 1 ] ) { \$ t m p = \$ e l e m e n t s [ \$ s w a p I n d e x ] ; \$ e l e m e n t s [ \$ s w a p I n d e x ] = \$ e l e m e n t s [ \$ s w a p I n d e x + 1 ] ; \$ e l e m e n t s [ \$ s w a p I n d e x + 1 ] = \$ t m p ; \$ s w a p p e d = t r u e ; } } i f ( ! \$ s w a p p e d ) { r e t u r n \$ e l e m e n t s ; } }
22. ### BUBBLE SORT (CONT.) ITERATIONS 2 5 4 3 4 5

1 9 1 2 9 8 1 4 5 3 4 2 2 2 6 2 1 2 1 2 5 4 3 4 5 1 9 1 2 9 8 1 4 5 3 4 2 2 2 6 ↪ 2 1 2 2 ↪ 2 5 4 3 4 5 1 9 1 2 9 8 1 4 5 3 4 2 2 2 6 ↪ 2 1 2 3 2 5 4 ↪ 3 4 5 1 9 1 2 9 8 1 4 5 3 4 2 2 2 6 ↪ 2 1 2 4 2 5 4 1 9 1 ⇅ ↪ 3 4 5 ⇅ 2 9 8 1 4 5 3 4 2 2 2 6 ↪ 2 1 2 5 2 5 4 1 9 1 2 9 8 ⇅ ↪ 3 4 5 ⇅ 1 4 5 3 4 2 2 2 6 ↪ 2 1 2 6 2 5 4 1 9 1 2 9 8 1 4 5 ⇅ ↪ 3 4 5 ⇅ 3 4 2 2 2 6 ↪ 2 1 2 7
23. ### 2 5 4 1 9 1 2 9 8 1

4 5 3 4 2 ⇅ ↪ 3 4 5 ⇅ 2 2 6 ↪ 2 1 2 8 2 5 4 1 9 1 2 9 8 1 4 5 3 4 2 2 2 6 ⇅ ↪ 3 4 5 ⇅ ↪ 2 1 2 9 2 5 4 1 9 1 2 9 8 1 4 5 3 4 2 2 2 6 2 1 2 ⇅ ↪ 3 4 5 ⇅ 1 0 2 5 4 1 9 1 2 9 8 1 4 5 3 4 2 2 2 6 ↪ 2 1 2 3 4 5 1 1 ↪ 2 5 4 1 9 1 2 9 8 1 4 5 3 4 2 2 2 6 ↪ 2 1 2 3 4 5 1 2 1 9 1 ⇅ ↪ 2 5 4 ⇅ 2 9 8 1 4 5 3 4 2 2 2 6 ↪ 2 1 2 3 4 5 1 3 1 9 1 2 5 4 ↪ 2 9 8 1 4 5 3 4 2 2 2 6 ↪ 2 1 2 3 4 5 1 4 1 9 1 2 5 4 1 4 5 ⇅ ↪ 2 9 8 ⇅ 3 4 2 2 2 6 ↪ 2 1 2 3 4 5 1 5 1 9 1 2 5 4 1 4 5 2 9 8 ↪ 3 4 2 2 2 6 ↪ 2 1 2 3 4 5 1 6 1 9 1 2 5 4 1 4 5 2 9 8 2 2 6 ⇅ ↪ 3 4 2 ⇅ ↪ 2 1 2 3 4 5 1 7 1 9 1 2 5 4 1 4 5 2 9 8 2 2 6 2 1 2 ⇅ ↪ 3 4 2 ⇅ 3 4 5 1 8 1 9 1 2 5 4 1 4 5 2 9 8 2 2 6 ↪ 2 1 2 3 4 2 3 4 5 1 9 ↪ 1 9 1 2 5 4 1 4 5 2 9 8 2 2 6 ↪ 2 1 2 3 4 2 3 4 5 2 0 1 9 1 ↪ 2 5 4 1 4 5 2 9 8 2 2 6 ↪ 2 1 2 3 4 2 3 4 5 2 1
24. ### 1 9 1 1 4 5 ⇅ ↪ 2 5

4 ⇅ 2 9 8 2 2 6 ↪ 2 1 2 3 4 2 3 4 5 2 2 1 9 1 1 4 5 2 5 4 ↪ 2 9 8 2 2 6 ↪ 2 1 2 3 4 2 3 4 5 2 3 1 9 1 1 4 5 2 5 4 2 2 6 ⇅ ↪ 2 9 8 ⇅ ↪ 2 1 2 3 4 2 3 4 5 2 4 1 9 1 1 4 5 2 5 4 2 2 6 2 1 2 ⇅ ↪ 2 9 8 ⇅ 3 4 2 3 4 5 2 5 1 9 1 1 4 5 2 5 4 2 2 6 ↪ 2 1 2 2 9 8 3 4 2 3 4 5 2 6 ↪ 1 9 1 1 4 5 2 5 4 2 2 6 ↪ 2 1 2 2 9 8 3 4 2 3 4 5 2 7 1 4 5 ⇅ ↪ 1 9 1 ⇅ 2 5 4 2 2 6 ↪ 2 1 2 2 9 8 3 4 2 3 4 5 2 8 1 4 5 1 9 1 ↪ 2 5 4 2 2 6 ↪ 2 1 2 2 9 8 3 4 2 3 4 5 2 9 1 4 5 1 9 1 2 2 6 ⇅ ↪ 2 5 4 ⇅ ↪ 2 1 2 2 9 8 3 4 2 3 4 5 3 0 1 4 5 1 9 1 2 2 6 2 1 2 ⇅ ↪ 2 5 4 ⇅ 2 9 8 3 4 2 3 4 5 3 1 1 4 5 1 9 1 2 2 6 ↪ 2 1 2 2 5 4 2 9 8 3 4 2 3 4 5 3 2 ↪ 1 4 5 1 9 1 2 2 6 ↪ 2 1 2 2 5 4 2 9 8 3 4 2 3 4 5 3 3 1 4 5 ↪ 1 9 1 2 2 6 ↪ 2 1 2 2 5 4 2 9 8 3 4 2 3 4 5 3 4 1 4 5 1 9 1 ↪ 2 2 6 ↪ 2 1 2 2 5 4 2 9 8 3 4 2 3 4 5 3 5
25. ### Sorted! 1 4 5 1 9 1 2 1 2

⇅ ↪ 2 2 6 ⇅ 2 5 4 2 9 8 3 4 2 3 4 5 3 6 1 4 5 1 9 1 ↪ 2 1 2 2 2 6 2 5 4 2 9 8 3 4 2 3 4 5 3 7 ↪ 1 4 5 1 9 1 ↪ 2 1 2 2 2 6 2 5 4 2 9 8 3 4 2 3 4 5 3 8 1 4 5 ↪ 1 9 1 ↪ 2 1 2 2 2 6 2 5 4 2 9 8 3 4 2 3 4 5 3 9 1 4 5 1 9 1 ↪ 2 1 2 2 2 6 2 5 4 2 9 8 3 4 2 3 4 5 4 0
26. ### BUBBLE SORT (CONT.) SUMMARY Best case: Ο(n) Average / worst

case: Ο(n2) Memory usage: Ο(n)
27. ### BUBBLE SORT (CONT.) THE UGLY KNUTH “The bubble sort seems

to have nothing to recommend it, except a catchy name and the fact that it leads to some interesting theoretical problems”
28. ### QUICK SORT CODE c l a s s Q u

i c k S o r t { p u b l i c f u n c t i o n s o r t ( a r r a y \$ e l e m e n t s ) { \$ t h i s - > d o Q u i c k S o r t ( \$ e l e m e n t s , 0 , c o u n t ( \$ e l e m e n t s ) - 1 ) ; r e t u r n \$ e l e m e n t s ; } f u n c t i o n d o Q u i c k S o r t ( \$ e l e m e n t s , \$ l e f t I n d e x , \$ r i g h t I n d e x ) { / / D i v i d e t h e a r r a y i n t w o , c r e a t i n g a “ p i v o t ” v a l u e / / M o v e a n y v a l u e l o w e r t h a n t h e p i v o t t o t h e l e f t a r r a y / / M o v e a n y v a l u e h i g h e r t h a n t h e p i v o t t o t h e r i g h t a r r a y / / R e c u r s i v e l y r e p e a t t h e s a m e o p e r a t i o n o n b o t h a r r a y s } }
29. ### QUICK SORT (CONT.) CODE: CREATE A PIVOT f u n

c t i o n d o Q u i c k S o r t ( \$ e l e m e n t s , \$ l e f t I n d e x , \$ r i g h t I n d e x ) { / / D i v i d e t h e a r r a y i n t w o , c r e a t i n g a “ p i v o t ” v a l u e \$ p i v o t I n d e x = c e i l ( \$ l e f t I n d e x + ( ( \$ r i g h t I n d e x - \$ l e f t I n d e x ) / 2 ) ) ; \$ p i v o t E l e m e n t = \$ e l e m e n t s [ \$ p i v o t I n d e x ] ; \$ l e f t S w a p I n d e x = \$ l e f t I n d e x ; \$ r i g h t S w a p I n d e x = \$ r i g h t I n d e x ; w h i l e ( \$ l e f t S w a p I n d e x < = \$ r i g h t S w a p I n d e x ) { / / M o v e t h e l e f t i n d e x u n t i l w e f i n d a n o u t o f o r d e r e l e m e n t / / M o v e t h e r i g h t i n d e x u n t i l w e f i n d a n o u t o f o r d e r e l e m e n t / / S w a p t h e m } }
30. ### QUICK SORT (CONT.) CODE: SWAP VALUES w h i l

e ( \$ l e f t S w a p I n d e x < = \$ r i g h t S w a p I n d e x ) { / / M o v e t h e l e f t i n d e x u n t i l w e f i n d a n o u t o f o r d e r e l e m e n t w h i l e ( \$ e l e m e n t s [ \$ l e f t S w a p I n d e x ] < \$ p i v o t E l e m e n t ) { \$ l e f t S w a p I n d e x + + ; } / / M o v e t h e r i g h t i n d e x u n t i l w e f i n d a n o u t o f o r d e r e l e m e n t w h i l e ( \$ e l e m e n t s [ \$ r i g h t S w a p I n d e x ] > \$ p i v o t E l e m e n t ) { \$ r i g h t S w a p I n d e x - - ; } / / S w a p t h e m i f ( \$ l e f t S w a p I n d e x < = \$ r i g h t S w a p I n d e x ) { \$ t m p = \$ e l e m e n t s [ \$ l e f t S w a p I n d e x ] ; \$ e l e m e n t s [ \$ l e f t S w a p I n d e x ] = \$ e l e m e n t s [ \$ r i g h t S w a p I n d e x ] ; \$ e l e m e n t s [ \$ r i g h t S w a p I n d e x ] = \$ t m p ; \$ l e f t S w a p I n d e x + + ; \$ r i g h t S w a p I n d e x - - ; } }
31. ### QUICK SORT (CONT.) CODE: RECURSE f u n c t

i o n d o Q u i c k S o r t ( \$ e l e m e n t s , \$ l e f t I n d e x , \$ r i g h t I n d e x ) { / / D i v i d e t h e a r r a y i n t w o , c r e a t i n g a “ p i v o t ” v a l u e / / M o v e a n y v a l u e l o w e r t h a n t h e p i v o t t o t h e l e f t a r r a y / / M o v e a n y v a l u e h i g h e r t h a n t h e p i v o t t o t h e r i g h t a r r a y / / R e c u r s i v e l y r e p e a t t h e s a m e o p e r a t i o n o n b o t h a r r a y s i f ( \$ l e f t I n d e x < \$ r i g h t S w a p I n d e x ) { \$ t h i s - > d o Q u i c k S o r t ( \$ e l e m e n t s , \$ l e f t I n d e x , \$ r i g h t S w a p I n d e x ) ; } i f ( \$ l e f t S w a p I n d e x < \$ r i g h t I n d e x ) { \$ t h i s - > d o Q u i c k S o r t ( \$ e l e m e n t s , \$ l e f t S w a p I n d e x , \$ r i g h t I n d e x ) ; } }
32. ### QUICK SORT (CONT.) ITERATIONS 1 9 3 2 0 3

1 0 2 5 2 6 4 4 2 2 4 4 2 8 2 1 ↪ 1 9 3 2 0 3 1 0 2 5 ↪ 2 6 4 4 2 2 4 4 ↪ 2 8 2 2 1 9 3 2 0 3 1 0 2 5 ↪ 2 6 4 4 2 ↪ 2 4 4 2 8 2 3 1 9 3 2 0 3 1 0 2 5 ↪ 2 4 4 ⇅ 4 2 ↪ 2 6 4 ⇅ 2 8 2 4 ↪ 1 9 3 2 0 3 1 0 2 ↪ 5 2 4 4 ↪ 4 2 2 6 4 2 8 2 5 ↪ 1 9 3 2 0 3 1 0 2 ↪ 5 2 4 4 4 2 2 6 4 2 8 2 6 ↪ 5 ⇅ 2 0 3 1 0 2 ↪ 1 9 3 ⇅ 2 4 4 4 2 2 6 4 2 8 2 7
33. ### Sorted! 5 ↪ 2 0 3 1 0 2 ↪

1 9 3 2 4 4 ↪ 4 2 2 6 4 2 8 2 8 5 ↪ 2 0 3 1 0 2 ↪ 1 9 3 2 4 4 ↪ 4 2 2 6 4 2 8 2 9 5 ↪ 4 2 ⇅ 1 0 2 ↪ 1 9 3 2 4 4 ↪ 2 0 3 ⇅ 2 6 4 2 8 2 1 0 5 4 2 1 0 2 ↪ 1 9 3 2 4 4 2 0 3 2 6 4 2 8 2 1 1 5 4 2 1 0 2 ↪ 1 9 3 2 4 4 2 0 3 2 6 4 2 8 2 1 2 5 ↪ 4 2 ↪ 1 0 2 1 9 3 2 4 4 2 0 3 2 6 4 2 8 2 1 3 5 4 2 ↪ 1 0 2 1 9 3 2 4 4 2 0 3 2 6 4 2 8 2 1 4 5 4 2 ↪ 1 0 2 1 9 3 2 4 4 2 0 3 2 6 4 2 8 2 1 5 5 4 2 1 0 2 1 9 3 ↪ 2 4 4 ↪ 2 0 3 2 6 4 2 8 2 1 6 5 4 2 1 0 2 1 9 3 ↪ 2 4 4 ↪ 2 0 3 2 6 4 2 8 2 1 7 5 4 2 1 0 2 1 9 3 ↪ 2 0 3 ⇅ ↪ 2 4 4 ⇅ 2 6 4 2 8 2 1 8 5 4 2 1 0 2 1 9 3 2 0 3 2 4 4 ↪ 2 6 4 ↪ 2 8 2 1 9 5 4 2 1 0 2 1 9 3 2 0 3 2 4 4 2 6 4 ↪ 2 8 2 2 0 5 4 2 1 0 2 1 9 3 2 0 3 2 4 4 2 6 4 ↪ 2 8 2 2 1
34. ### QUICK SORT (CONT.) SUMMARY Best / average case: Ο(n log

n) Worst case: Ο(n2) Implemented by s o r t ( ) Easily parallelized
35. ### HEAP SORT CODE c l a s s H e

a p S o r t { p u b l i c f u n c t i o n s o r t ( a r r a y \$ e l e m e n t s ) { \$ s i z e = c o u n t ( \$ e l e m e n t s ) ; f o r ( \$ i n d e x = f l o o r ( ( \$ s i z e / 2 ) ) - 1 ; \$ i n d e x > = 0 ; \$ i n d e x - - ) { \$ e l e m e n t s = \$ t h i s - > s i f t D o w n ( \$ e l e m e n t s , \$ i n d e x , \$ s i z e ) ; } f o r ( \$ i n d e x = \$ s i z e - 1 ; \$ i n d e x > = 1 ; \$ i n d e x - - ) { \$ t m p = \$ e l e m e n t s [ 0 ] ; \$ e l e m e n t s [ 0 ] = \$ e l e m e n t s [ \$ i n d e x ] ; \$ e l e m e n t s [ \$ i n d e x ] = \$ t m p ; \$ e l e m e n t s = \$ t h i s - > s i f t D o w n ( \$ e l e m e n t s , 0 , \$ i n d e x - 1 ) ; } r e t u r n \$ e l e m e n t s ; } }
36. ### HEAP SORT (CONT.) CODE: SIFT THE HEAP p u b

l i c f u n c t i o n s i f t D o w n ( a r r a y \$ e l e m e n t s , \$ r o o t , \$ b o t t o m ) { \$ d o n e = f a l s e ; w h i l e ( ( \$ r o o t * 2 < = \$ b o t t o m ) & & ( ! \$ d o n e ) ) { i f ( \$ r o o t * 2 = = \$ b o t t o m ) \$ m a x C h i l d = \$ r o o t * 2 ; e l s e i f ( \$ e l e m e n t s [ \$ r o o t * 2 ] > \$ e l e m e n t s [ \$ r o o t * 2 + 1 ] ) \$ m a x C h i l d = \$ r o o t * 2 ; e l s e \$ m a x C h i l d = \$ r o o t * 2 + 1 ; i f ( \$ e l e m e n t s [ \$ r o o t ] < \$ e l e m e n t s [ \$ m a x C h i l d ] ) { \$ t m p = \$ e l e m e n t s [ \$ r o o t ] ; \$ e l e m e n t s [ \$ r o o t ] = \$ e l e m e n t s [ \$ m a x C h i l d ] ; \$ e l e m e n t s [ \$ m a x C h i l d ] = \$ t m p ; \$ r o o t = \$ m a x C h i l d ; } e l s e \$ d o n e = t r u e ; } r e t u r n \$ e l e m e n t s ; }
37. ### HEAP SORT (CONT.) ITERATIONS 1 4 7 1 4 6

6 1 2 3 3 2 9 7 2 6 6 3 1 2 2 9 2 1 1 4 7 1 4 6 6 1 ↪ 2 3 3 2 9 7 2 6 6 ↪ 3 1 2 2 9 2 2 1 4 7 1 4 6 6 1 ↪ 3 1 2 ⇅ 2 9 7 2 6 6 ↪ 2 3 3 ⇅ 2 9 2 3 1 4 7 1 4 6 ↪ 6 1 3 1 2 ↪ 2 9 7 2 6 6 2 3 3 2 9 2 4 1 4 7 1 4 6 ↪ 2 9 7 ⇅ 3 1 2 ↪ 6 1 ⇅ 2 6 6 2 3 3 2 9 2 5 1 4 7 ↪ 1 4 6 2 9 7 ↪ 3 1 2 6 1 2 6 6 2 3 3 2 9 2 6 1 4 7 ↪ 3 1 2 ⇅ 2 9 7 ↪ 1 4 6 ⇅ 6 1 2 6 6 2 3 3 2 9 2 7
38. ### 1 4 7 3 1 2 2 9 7 ↪

1 4 6 6 1 2 6 6 2 3 3 ↪ 2 9 2 8 1 4 7 3 1 2 2 9 7 ↪ 2 9 2 ⇅ 6 1 2 6 6 2 3 3 ↪ 1 4 6 ⇅ 9 ↪ 1 4 7 ↪ 3 1 2 2 9 7 2 9 2 6 1 2 6 6 2 3 3 1 4 6 1 0 ↪ 3 1 2 ⇅ ↪ 1 4 7 ⇅ 2 9 7 2 9 2 6 1 2 6 6 2 3 3 1 4 6 1 1 3 1 2 ↪ 1 4 7 ↪ 2 9 7 2 9 2 6 1 2 6 6 2 3 3 1 4 6 1 2 3 1 2 ↪ 2 9 7 ⇅ ↪ 1 4 7 ⇅ 2 9 2 6 1 2 6 6 2 3 3 1 4 6 1 3 3 1 2 2 9 7 ↪ 1 4 7 2 9 2 6 1 ↪ 2 6 6 2 3 3 1 4 6 1 4 3 1 2 2 9 7 ↪ 2 6 6 ⇅ 2 9 2 6 1 ↪ 1 4 7 ⇅ 2 3 3 1 4 6 1 5 ↪ 3 1 2 2 9 7 2 6 6 2 9 2 6 1 1 4 7 2 3 3 ↪ 1 4 6 1 6 ↪ 1 4 6 ⇅ 2 9 7 2 6 6 2 9 2 6 1 1 4 7 2 3 3 ↪ 3 1 2 ⇅ 1 7 ↪ 1 4 6 ↪ 2 9 7 2 6 6 2 9 2 6 1 1 4 7 2 3 3 3 1 2 1 8 ↪ 2 9 7 ⇅ ↪ 1 4 6 ⇅ 2 6 6 2 9 2 6 1 1 4 7 2 3 3 3 1 2 1 9 2 9 7 ↪ 1 4 6 2 6 6 ↪ 2 9 2 6 1 1 4 7 2 3 3 3 1 2 2 0 2 9 7 ↪ 2 9 2 ⇅ 2 6 6 ↪ 1 4 6 ⇅ 6 1 1 4 7 2 3 3 3 1 2 2 1
39. ### 2 9 7 2 9 2 2 6 6 ↪

1 4 6 6 1 1 4 7 ↪ 2 3 3 3 1 2 2 2 2 9 7 2 9 2 2 6 6 ↪ 2 3 3 ⇅ 6 1 1 4 7 ↪ 1 4 6 ⇅ 3 1 2 2 3 ↪ 2 9 7 2 9 2 2 6 6 2 3 3 6 1 1 4 7 ↪ 1 4 6 3 1 2 2 4 ↪ 1 4 6 ⇅ 2 9 2 2 6 6 2 3 3 6 1 1 4 7 ↪ 2 9 7 ⇅ 3 1 2 2 5 ↪ 1 4 6 ↪ 2 9 2 2 6 6 2 3 3 6 1 1 4 7 2 9 7 3 1 2 2 6 ↪ 2 9 2 ⇅ ↪ 1 4 6 ⇅ 2 6 6 2 3 3 6 1 1 4 7 2 9 7 3 1 2 2 7 2 9 2 ↪ 1 4 6 ↪ 2 6 6 2 3 3 6 1 1 4 7 2 9 7 3 1 2 2 8 2 9 2 ↪ 2 6 6 ⇅ ↪ 1 4 6 ⇅ 2 3 3 6 1 1 4 7 2 9 7 3 1 2 2 9 2 9 2 2 6 6 ↪ 1 4 6 2 3 3 6 1 ↪ 1 4 7 2 9 7 3 1 2 3 0 2 9 2 2 6 6 ↪ 1 4 7 ⇅ 2 3 3 6 1 ↪ 1 4 6 ⇅ 2 9 7 3 1 2 3 1 ↪ 2 9 2 2 6 6 1 4 7 2 3 3 6 1 ↪ 1 4 6 2 9 7 3 1 2 3 2 ↪ 1 4 6 ⇅ 2 6 6 1 4 7 2 3 3 6 1 ↪ 2 9 2 ⇅ 2 9 7 3 1 2 3 3 ↪ 1 4 6 ↪ 2 6 6 1 4 7 2 3 3 6 1 2 9 2 2 9 7 3 1 2 3 4 ↪ 2 6 6 ⇅ ↪ 1 4 6 ⇅ 1 4 7 2 3 3 6 1 2 9 2 2 9 7 3 1 2 3 5
40. ### 2 6 6 ↪ 1 4 6 1 4 7

↪ 2 3 3 6 1 2 9 2 2 9 7 3 1 2 3 6 2 6 6 ↪ 2 3 3 ⇅ 1 4 7 ↪ 1 4 6 ⇅ 6 1 2 9 2 2 9 7 3 1 2 3 7 ↪ 2 6 6 2 3 3 1 4 7 1 4 6 ↪ 6 1 2 9 2 2 9 7 3 1 2 3 8 ↪ 6 1 ⇅ 2 3 3 1 4 7 1 4 6 ↪ 2 6 6 ⇅ 2 9 2 2 9 7 3 1 2 3 9 ↪ 6 1 ↪ 2 3 3 1 4 7 1 4 6 2 6 6 2 9 2 2 9 7 3 1 2 4 0 ↪ 2 3 3 ⇅ ↪ 6 1 ⇅ 1 4 7 1 4 6 2 6 6 2 9 2 2 9 7 3 1 2 4 1 2 3 3 ↪ 6 1 ↪ 1 4 7 1 4 6 2 6 6 2 9 2 2 9 7 3 1 2 4 2 2 3 3 ↪ 1 4 7 ⇅ ↪ 6 1 ⇅ 1 4 6 2 6 6 2 9 2 2 9 7 3 1 2 4 3 ↪ 2 3 3 1 4 7 6 1 ↪ 1 4 6 2 6 6 2 9 2 2 9 7 3 1 2 4 4 ↪ 1 4 6 ⇅ 1 4 7 6 1 ↪ 2 3 3 ⇅ 2 6 6 2 9 2 2 9 7 3 1 2 4 5 ↪ 1 4 6 ↪ 1 4 7 6 1 2 3 3 2 6 6 2 9 2 2 9 7 3 1 2 4 6 ↪ 1 4 7 ⇅ ↪ 1 4 6 ⇅ 6 1 2 3 3 2 6 6 2 9 2 2 9 7 3 1 2 4 7 ↪ 1 4 7 1 4 6 ↪ 6 1 2 3 3 2 6 6 2 9 2 2 9 7 3 1 2 4 8 ↪ 6 1 ⇅ 1 4 6 ↪ 1 4 7 ⇅ 2 3 3 2 6 6 2 9 2 2 9 7 3 1 2 4 9
41. ### Sorted! ↪ 6 1 ↪ 1 4 6 1 4

7 2 3 3 2 6 6 2 9 2 2 9 7 3 1 2 5 0 ↪ 1 4 6 ⇅ ↪ 6 1 ⇅ 1 4 7 2 3 3 2 6 6 2 9 2 2 9 7 3 1 2 5 1 ↪ 1 4 6 ↪ 6 1 1 4 7 2 3 3 2 6 6 2 9 2 2 9 7 3 1 2 5 2 ↪ 6 1 ⇅ ↪ 1 4 6 ⇅ 1 4 7 2 3 3 2 6 6 2 9 2 2 9 7 3 1 2 5 3
42. ### HEAP SORT (CONT.) SUMMARY Best / average / worst case:

Ο(n log n) Implemented by S p l M i n H e a p ( ) \$ h = n e w S p l M i n H e a p ( ) ; f o r e a c h ( \$ u n s o r t e d a s \$ v a l ) \$ h - > i n s e r t ( \$ v a l ) ; \$ h - > t o p ( ) ; w h i l e ( \$ h - > v a l i d ( ) ) { e c h o \$ h - > c u r r e n t ( ) . " \ n " ; \$ h - > n e x t ( ) ; }

44. ### SEQUENTIAL SEARCH CODE c l a s s S e

q u e n t i a l S e a r c h { p u b l i c f u n c t i o n s e a r c h ( \$ t a r g e t , a r r a y \$ e l e m e n t s ) { \$ i t e r a t i o n s = c o u n t ( \$ e l e m e n t s ) ; f o r ( \$ i n d e x = 0 ; \$ i n d e x < = \$ i t e r a t i o n s ; \$ i n d e x + + ) { i f ( \$ t a r g e t = = \$ e l e m e n t s [ \$ i n d e x ] ) { \$ t h i s - > n o t i f y O b s e r v e r s ( a r r a y ( \$ i n d e x ) ) ; r e t u r n t r u e ; } } r e t u r n f a l s e ; } }
45. ### SEQUENTIAL SEARCH (CONT.) ITERATIONS Found you! 1 8 ↪ 6

1 8 3 4 5 5 1 7 1 1 8 8 3 1 0 1 1 8 6 ✘ ↪ 1 8 3 4 5 5 1 7 1 1 8 8 3 1 0 2 1 8 6 ✘ ↪ 1 8 ✔ 3 4 5 5 1 7 1 1 8 8 3 1 0 3
46. ### SEQUENTIAL SEARCH (CONT.) SUMMARY Best case: Ο(1) Average / Worst

case: Ο(n) Not as pointless as it looks...
47. ### BINARY SEARCH CODE c l a s s B i

n a r y S e a r c h { p u b l i c f u n c t i o n s e a r c h ( \$ t a r g e t , a r r a y \$ e l e m e n t s ) { r e t u r n \$ t h i s - > d o B i n a r y S e a r c h ( \$ t a r g e t , \$ e l e m e n t s , 0 , c o u n t ( \$ e l e m e n t s ) ) ; } p u b l i c f u n c t i o n d o B i n a r y S e a r c h ( \$ t a r g e t , a r r a y \$ e l e m e n t s , \$ m i n I n d e x , \$ m a x I n d e x ) { i f ( \$ m a x I n d e x < \$ m i n I n d e x ) { r e t u r n f a l s e ; } \$ m i d I n d e x = f l o o r ( ( \$ m i n I n d e x + \$ m a x I n d e x ) / 2 ) ; i f ( \$ e l e m e n t s [ \$ m i d I n d e x ] > \$ t a r g e t ) { r e t u r n \$ t h i s - > d o B i n a r y S e a r c h ( \$ t a r g e t , \$ e l e m e n t s , \$ m i n I n d e x , \$ m i d I n d e x - 1 ) ; } i f ( \$ e l e m e n t s [ \$ m i d I n d e x ] < \$ t a r g e t ) { r e t u r n \$ t h i s - > d o B i n a r y S e a r c h ( \$ t a r g e t , \$ e l e m e n t s , \$ m i d I n d e x + 1 , \$ m a x I n d e x ) ; } r e t u r n t r u e ; } }

49. ### Found you! 5 6 5 2 5 6 1 2

8 1 5 6 1 6 5 1 8 2 ↪ 2 3 6 2 5 6 2 7 4 3 1 0 3 1 0 3 2 8 3 3 0 1 5 6 5 2 5 6 ↪ 1 2 8 1 5 6 1 6 5 1 8 2 2 3 6 ✘ 2 5 6 2 7 4 3 1 0 3 1 0 3 2 8 3 3 0 2 5 6 ↪ 5 2 5 6 1 2 8 ✘ 1 5 6 1 6 5 1 8 2 2 3 6 ✘ 2 5 6 2 7 4 3 1 0 3 1 0 3 2 8 3 3 0 3 5 6 5 2 ✘ ↪ 5 6 1 2 8 ✘ 1 5 6 1 6 5 1 8 2 2 3 6 ✘ 2 5 6 2 7 4 3 1 0 3 1 0 3 2 8 3 3 0 4 5 6 5 2 ✘ ↪ 5 6 ✔ 1 2 8 ✘ 1 5 6 1 6 5 1 8 2 2 3 6 ✘ 2 5 6 2 7 4 3 1 0 3 1 0 3 2 8 3 3 0 5
50. ### BINARY SEARCH (CONT.) SUMMARY Best case: Ο(1) Average / Worst

case: Ο(log n) Switch to linear search for smaller partitions

52. ### HISTORY Insertion Sort: optimised in 1959 (Shell Sort) Bubble Sort:

improved in 1980 (Comb Sort) Quick Sort: developed in 1960 (C. A. R. Hoare) Heap Sort: improved in the '60s (Robert Floyd) Oh, and there's Radix Sort used by Herman Hollerith in 1887