Remember Sorting_Machine?

Preview:

DESCRIPTION

Change_To_ Extraction_Phase. In. Out. Remember Sorting_Machine?. Isn’t it a beauty! Go ahead . . . kick the tires!. 2: Push the button. 1: Items go in here. 3: Sorted items come out here. Sorting_Machine Continued…. Change_To_ Extraction_Phase. In. Out. - PowerPoint PPT Presentation

Citation preview

Remember Sorting_Machine?

Isn’t it a beauty!Go ahead . . .kick the tires!

Change_To_Extraction_Phase

In Out

Sorting_Machine Continued…

Change_To_Extraction_Phase

In Out

3: Sorted items come out here

2: Push the button

1: Itemsgo in here

Sorting_Machine Continued…

Type (

inserting: boolean contents: multiset of Item)

Initial value (true, {})

A Math Type: Multiset Multisets are just like sets except

that duplicates are allowed In set theory:

{2, 18, 2, 36} = {2, 18, 36} and|{2, 18, 2, 36}| = 3

In multiset theory:{2, 18, 2, 36} /= {2, 18, 36} and|{2, 18, 2, 36}| = 4

Sorting_Machine Continued…

Operations m.Insert (x) m.Change_To_Extraction_Phase ( ) m.Remove_First (x) m.Remove_Any (x) m.Is_In_Extraction_Phase ( ) m.Size ( )

Sorting With Sorting_Machine// input a bunch of integers placing them in sorting machine mwhile (not ins.At_EOS ()){ object Integer i; ins >> i; m.Insert (i);}// now output the same integers in sorted orderm.Change_To_Extraction_Phase ();while (m.Size () > 0){ object Integer i; m.Remove_First (i); outs << i << ‘\n’;}

Sorting Algorithms

Selection Sort Insertion Sort Mergesort Quicksort Heapsort Tree Sort …

A Sort Procedure

procedure Sort ( alters Queue_Of_Item& q ); /*! ensures q is permutation of #q and IS_ORDERED (q) !*/

Math Definition

math definition IS_ORDERED ( s: string of Item ): boolean is for all u, v: Item where (<u> * <v> is substring

of s) (ARE_IN_ORDER (u, v))

An Old Math Definition

math definition ARE_IN_ORDER ( x: Item, y: Item ): boolean satisfies restriction for all x, y, z: Item (ARE_IN_ORDER (x, x) and (ARE_IN_ORDER (x, y) or ARE_IN_ORDER (y, x)) and (if (ARE_IN_ORDER (x, y) and ARE_IN_ORDER (y, z)) then ARE_IN_ORDER (x, z)))

Selection Sortprocedure Remove_Min ( alters Queue_Of_Item& q, produces Item& x ); /*! requires q /= empty_string ensures (q * <x>) is permutation of #q and for all y: Item where (y is in elements (q)) (ARE_IN_ORDER (x, y)) !*/

Selection Sort: You Give It A Tryprocedure Sort ( alters Queue_Of_Item& q ){

}

object Queue_Of_Item tmp; while (q.Length () > 0) { object Item x; Remove_Min (q, x); tmp.Enqueue (x); } q &= tmp;

Insertion Sortprocedure Insert_In_Order ( alters Queue_Of_Item& q, consumes Item& x ); /*! requires IS_ORDERED (q) ensures q is permutation of (#q * <#x>) and IS_ORDERED (q) !*/

Insertion Sort: You Give It A Try

procedure Sort ( alters Queue_Of_Item& q ){

}

object Queue_Of_Item tmp; while (q.Length () > 0) { object Item x; q.Dequeue (x); Insert_In_Order (tmp, x); } q &= tmp;

Quicksortprocedure Partition ( consumes Queue_Of_Item& q, preserves Item& p, produces Queue_Of_Item& q1, produces Queue_Of_Item& q2 ); /*! ensures q1 * q2 is permutation of #q and for all x: Item where (x is in elements (q1)) (ARE_IN_ORDER (x, p)) and for all x: Item where (x is in elements (q2)) (not ARE_IN_ORDER (x, p)) !*/

Quicksort Continued…procedure Combine ( produces Queue_Of_Item& q, consumes Item& p, consumes Queue_Of_Item& q1, consumes Queue_Of_Item& q2 ); /*! ensures q = #q1 * <#p> * #q2 !*/

Quicksort: You Give It A Tryprocedure Sort ( alters Queue_Of_Item& q ){

}

if (q.Length () > 1) { object Item x; object Queue_Of_Item q1, q2; q.Dequeue (x); Partition (q, x, q1, q2); Sort (q1); Sort (q2); Combine (q, x, q1, q2); }

Quicksort Continued…procedure Partition ( consumes Queue_Of_Item& q, preserves Item& p, produces Queue_Of_Item& q1, produces Queue_Of_Item& q2 ){

}

q1.Clear (); q2.Clear (); while (q.Length () > 0) { object Item x; q.Dequeue (x); if (Item_Are_In_Order::Are_In_Order (x, p)) { q1.Enqueue (x); } else { q2.Enqueue (x); } }

Quicksort Continued…procedure Combine ( produces Queue_Of_Item& q, consumes Item& p, consumes Queue_Of_Item& q1, consumes Queue_Of_Item& q2 ){

}

q.Clear (); q &= q1; q.Enqueue (p); while (q2.Length () > 0) { object Item x; q2.Dequeue (x); q.Enqueue (x); }

Mergesortprocedure Split ( consumes Queue_Of_Item& q, produces Queue_Of_Item& q1, produces Queue_Of_Item& q2 ); /*! ensures q1 * q2 is permutation of #q and |q2| <= |q1| <= |q2| + 1 !*/

Mergesort Continued…procedure Merge ( consumes Queue_Of_Item& q1, consumes Queue_Of_Item& q2, produces Queue_Of_Item& q ); /*! requires IS_ORDERED (q1) and IS_ORDERED (q2) ensures q is permutation of #q1 * #q2 and IS_ORDERED (q) !*/

Mergesort: You Give It A Try

procedure Sort ( alters Queue_Of_Item& q ){

}

if (q.Length () > 1) { object Queue_Of_Item q1, q2; Split (q, q1, q2); Sort (q1); Sort (q2); Merge (q1, q2, q); }

Sorting_Machine: Inside Story

Are you ready tolook under thehood of this baby?

Change_To_Extraction_Phase

In Out

Inside Story Continued…

As an example, assume the representation for Sorting_Machine has two fields: contents_rep of type Queue_Of_Item inserting_rep of type Boolean

What are some possible implementations?

Let’s Procrastinate — the Students’ Choice

operation

m.Insert (x)

m.Change_To_ Extraction_Phase ()

m.Remove_First (x)

m.Remove_Any (x)

what happens?

q.Enqueue (x)

set phase to extraction

Remove_Min (q, x)

q.Dequeue (x)

c1

c2

c3n

c4

How long will it take to perform each operationas a function of n = |m.contents|?

cn2

c1n

c3n2

How About Eager Beavers

operation

m.Insert (x)

m.Change_To_ Extraction_Phase ()

m.Remove_First (x)

m.Remove_Any (x)

what happens?

Insert_In_Order (q, x)

set phase to extraction

q.Dequeue (x)

q.Dequeue (x)

c1n

c2

c3

c3

How long will it take to perform each operationas a function of n = |m.contents|?

cn2

c1n2

c3n

Are There Other Possibilities?

operation

m.Insert (x)

m.Change_To_ Extraction_Phase ()

m.Remove_First (x)

m.Remove_Any (x)

what happens?

q.Enqueue (x)

q.Sort ()set phase to extraction

q.Dequeue (x)

q.Dequeue (x)

c1

c2nlogn

c3

c3

How long will it take to perform each operationas a function of n = |m.contents|?

cnlogn

c1n

c3n

A Heapsort Implementation

An ARE_IN_ORDER Heap is a special kind of binary tree: shape property: the tree is complete ordering property: for each item x in

the tree, ARE_IN_ORDER (x, child) holds for each child of x

Complete Binary Trees All levels of the tree are completely

filled up except possibly the bottom level. Any “holes” in the bottom level must appear to the right of all existing items at that level.

Heap Ordering Property For each item x in the tree:

x

y z

ARE_IN_ORDER (x, y) andARE_IN_ORDER (x, z)

x

yARE_IN_ORDER (x, y)

Examples

18

36 24

5853 61

18

36 24

53 12 18

36 24

53 61 58

14

21 12

Item is IntegerARE_IN_ORDER (x, y) x y

18

36

53 38

14

21

Heapsort

Build an ARE_IN_ORDER heap with the items to be sorted using the specified ARE_IN_ORDER

Implement Remove_First so that, after removing the first item in the ordering from the heap, it restores the heap properties

How Will Remove_First Work?

12

46 18

54 73 37

82 63

99

46 18

54 73 37

82 63

99

1263

46 18

54 73 37

82

99

18

46 63

54 73 37

82

99

18

46 37

54 73 63

82

99

Sift _Root _Down

procedure Sift_Root_Down ( alters “binary tree” t ); /*! requires [t is a complete tree and both left and right subtrees of t are heaps] ensures [t is a heap and t contains exactly the items in #t] !*/

Turning a Complete Tree Into a Heap

procedure Heapify ( alters “binary tree” t ); /*! requires [t is a complete tree] ensures [t is a heap and t contains exactly the items in #t] !*/

Hint:

Turning a Complete Tree Into a Heap Continued…

procedure_body Heapify ( alters “binary tree” t ){

}

if (|t| > 1) { Heapify (left subtree of t) Heapify (right subtree of t) Sift _Root_Down (t) }

Mapping Complete Binary TreePositions Into Array Locations

12

46 18

54 73 37

82 63

99

Let’s number the tree positions (top-bottom, left-right)(1)

(2) (3)

(4) (5) (6) (7)

(9)(8)

Which array corresponds to the tree?

1 2 3 4 5 6 7 8 9

12 46 18 54 73 37 99 82 63

x

y z

(i)

(2i) (2i+1)

Remember Array Operations?

a.Set_Bounds (lower, upper) a[i] --accessor operation a.Lower_Bound () a.Upper_Bound ()

Insertion-Phase Container?

What is the effect ofa.Set_Bounds (lower, upper)?

At what point will the Sorting_Machine be ready to set the array bounds?

Swapping/Comparing Two Elements in an Array Given:

object Array_Of_Item a;object Integer i, j;

What’s wrong with: a[i] &= a[j] and Item_Are_In_Order::Are_In_Order (a[i], a[j])?

They violate the repeated argument rule a[i] and a[j] are references to parts of a’s

representation: the parts could be the same (see Partial_Map_Kernel_3)

Swapping Two Array Elements Use a.Exchange_At (i, j) instead of

a[i] &= a[j] Exchange_At is an Array extension It requires that a.lb i, j a.ub See AT/Array/Exchange_At.h in the

RESOLVE_Catalog for complete specs

Comparing Two Array Elements Use a.Are_In_Order_At (i, j) instead of

Item_Are_In_Order::Are_In_Order (a[i], a[j])

Are_In_Order_At is an Array extension It requires that a.lb i, j a.ub See AT/Array/Are_In_Order_At.h in the

RESOLVE_Catalog for complete specs

Sorting_Machine_Kernel_2: Component Coupling Diagram

Sorting_Machine_Type

ext

i

Sorting_Machine_Kernel

Sorting_Machine_Kernel_2

Representation Array_Kernel

u uenc

i i i

Queue_Kernel

Array_Exchange_At

Array_Are_In_Order_At

General_Are_In_Order

i u

i

i