Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the...

57
1 Searching and Sorting (Section 9) College of Computer Science and Engineering Taibah University S1, 1438 Algorithms and Data Structures (CS211 & CS202) Lecture Scope Searching algorithms Linear Search Binary Search Several sorting algorithms, including: Selection Sort Insertion Sort Bubble Sort Heap Sort Quick Sort Merge Sort Complexity of the search and sort algorithms 2

Transcript of Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the...

Page 1: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

1

Searching and Sorting

(Section 9)

College of Computer Science and Engineering

Taibah University

S1, 1438

Algorithms and Data Structures(CS211 & CS202)

Lecture Scope

Searching algorithms

Linear Search

Binary Search

Several sorting algorithms, including:

Selection Sort

Insertion Sort

Bubble Sort

Heap Sort

Quick Sort

Merge Sort

Complexity of the search and sort algorithms2

Page 2: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

2

Searching

3

Linear search

Binary search

Searching

Searching is the process of finding a target element

among a group of items (the search pool), or

determining that it isn't there

This requires repetitively comparing the target to

candidates in the search pool

An efficient search performs no more comparisons

than it has to

4

Page 3: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

3

Searching (cont…)

We'll define the algorithms such that they can search any set of

objects, therefore we will search objects that implement the

Comparable interface

Recall that the compareTo method returns an integer that specifies

the relationship between two objects:

obj1.compareTo(obj2)

This call returns a number less than, equal to, or greater than 0 if

obj1 is less than, equal to, or greater than obj2, respectively

5

Linear Search

A linear search simply examines each item in the search pool,

one at a time, until either the target is found or until the pool is

exhausted

This approach does not assume the items in the search pool

are in any particular order

6

Page 4: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

4

/**

* Searches the specified array of objects using a linear search

* algorithm.

*

* @param data the array to be searched

* @param min the integer representation of the minimum value

* @param max the integer representation of the maximum value

* @param target the element being searched for

* @return true if the desired element is found

*/

public static <T>

boolean linearSearch(T[] data, int min, int max, T target)

{

int index = min;

boolean found = false;

while (!found && index <= max)

{

found = data[index].equals(target);

index++;

}

return found;

}7

Linear Search - implementation

Binary Search

If the search pool is sorted, then we can be more efficient than a

linear search

A binary search eliminates large parts of the search pool with each

comparison

Instead of starting the search at one end, we begin in the middle

If the target isn't found, we know that if it is in the pool at all, it is in

one half or the other

We can then jump to the middle of that half, and continue similarly

8

Page 5: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

5

Binary Search (cont…)

A binary search algorithm is often implemented

recursively

Each recursive call searches a smaller portion of

the search pool

The base case is when there are no more viable

candidates

At any point there may be two “middle” values, in

which case the first is used

9

Binary Search (cont…)

For example, find the number 29 in the following sorted list of

numbers:

8 15 22 29 36 54 55 61 70 73 88

First, compare the target to the middle value 54

We now know that if 29 is in the list, it is in the front half of the list

With one comparison, we’ve eliminated half of the data

Then compare to 22, eliminating another quarter of the data, etc.

10

Page 6: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

6

found = BinarySearch(info, 25, 0, 14 );

item fromLoc toLoc

indexes

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

info

0 2 4 6 8 10 12 14 16 18 20 22 24 26 28

16 18 20 22 24 26 28

24 26 28

24

NOTE: denotes element examined 11

Binary Search - Example

public boolean BinarySearch (int info[ ], int item, int fromLoc, int toLoc)

// Pre: info [ fromLoc . . toLoc ] sorted in ascending order

// Post: Function value = ( item in info [ fromLoc . . toLoc] )

{ int mid ;

if ( fromLoc > toLoc ) // base case -- not found

return false ;

else {

mid = ( fromLoc + toLoc ) / 2 ;

if ( info[mid] == item ) // base case-- found at mid

return true ;

else if ( item < info[mid] ) // search lower half

return BinarySearch ( info, item, fromLoc, mid-1 ) ;

else // search upper half

return BinarySearch( info, item, mid + 1, toLoc ) ;

}

}

12

Binary Search - Implementation

Page 7: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

7

/**

* Searches the specified array of objects using a binary search

* algorithm.

*

* @param data the array to be searched

* @param min the integer representation of the minimum value

* @param max the integer representation of the maximum value

* @param target the element being searched for

* @return true if the desired element is found

*/

public static <T extends Comparable<T>>

boolean binarySearch(T[] data, int min, int max, T target)

{

boolean found = false;

int midpoint = (min + max) / 2; // determine the midpoint

if (data[midpoint].compareTo(target) == 0)

found = true;

else if (data[midpoint].compareTo(target) > 0)

{

if (min <= midpoint - 1)

found = binarySearch(data, min, midpoint - 1, target);

}

else if (midpoint + 1 <= max)

found = binarySearch(data, midpoint + 1, max, target);

return found;

}13

Binary Search - Implementation (cont…)

Comparing Search Algorithms

The expected case for finding an element with

a linear search is n/2, which is O(n)

Worst case is also O(n)

The worst case for binary search is (log2n) / 2

comparisons

Which makes binary search O(log n)

Keep in mind that for binary search to work, the

elements must be already sorted14

Page 8: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

8

Sorting

15

1. Selection sort

2. Insertion sort

3. Bubble sort

4. Heap sort

5. Quick sort

6. Merge sort

Sorting

Sorting is the process of arranging a group of items

into a defined order based on particular criteria

Many sorting algorithms have been designed

Sequential sorts require approximately n2 comparisons

to sort n elements

Logarithmic sorts typically require nlog2n comparisons

to sort n elements

16

Page 9: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

9

Selection Sort

Selection sort orders a list of values by repetitively putting a

particular value into its final position

More specifically:

find the smallest value in the list

switch it with the value in the first position

find the next smallest value in the list

switch it with the value in the second position

repeat until all values are in their proper places

17

1

Selection Sort (cont…)

18

Page 10: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

10

selectionsort(data[ ])

for i = 0 to data.length-2

select the smallest element among

data[i], …, data[data.length-1];

swap it with data[i];

Algorithm:

Selection Sort (cont…)

19

/**

* Sorts the specified array of integers using the selection

* sort algorithm.

*

* @param data the array to be sorted

*/

public static <T extends Comparable<T>>

void selectionSort(T[] data)

{

int min;

T temp;

for (int index = 0; index < data.length-1; index++)

{

min = index;

for (int scan = index+1; scan < data.length; scan++)

if (data[scan].compareTo(data[min])<0)

min = scan;

swap(data, min, index);

}

}

20

Selection Sort - Implementation

Page 11: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

11

/**

* Swaps to elements in an array. Used by various sorting algorithms.

*

* @param data the array in which the elements are swapped

* @param index1 the index of the first element to be swapped

* @param index2 the index of the second element to be swapped

*/

private static <T extends Comparable<T>>

void swap(T[] data, int index1, int index2)

{

T temp = data[index1];

data[index1] = data[index2];

data[index2] = temp;

}

21

Selection Sort - Implementation (cont…)

Selection Sort - Implementation (cont…)

22

public static void selectionSort(int[] A,int length)

{

for (int i=0; i < (length -1); i++)

{

for (int j = i+1; j < length; j++)

{

if (A[i] > A[j])

{

//... Exchange elements

int temp = A[i];

A[i] = A[j];

A[j] = temp;

}

}

}

}

The same implementation with some differences in the code

Page 12: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

12

5

3

4

1

2 1

3

4

2

5

1

2

4

3

5

1

2

3

4

5

1

2

3

4

5

1

2

3

4

5

2

5

1

3

4

23

Selection Sort - Example

(random)

best case avg caseworst case

comparisons O(n2) O(n2) O(n2)

movements 0 O(n) O(n)

24

Selection Sort: Computational Complexity

(ordered)

Page 13: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

13

Insertion Sort

Insertion sort orders a values by repetitively inserting a particular

value into a sorted subset of the list

More specifically:

consider the first item to be a sorted sublist of length 1

insert the second item into the sorted sublist, shifting the first item if

needed

insert the third item into the sorted sublist, shifting the other items as

needed

repeat until all values have been inserted into their proper positions

25

2

Insertion Sort (cont…)

26

Page 14: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

14

insertionsort(data[ ])

for i = 1 to data.length-1

tmp = data[i];

move all elements data[j] greater than tmp by one position;

place tmp in its proper position;

27

Insertion Sort (cont…)

Algorithm:

/**

* Sorts the specified array of objects using an insertion

* sort algorithm.

*

* @param data the array to be sorted

*/

public static <T extends Comparable<T>>

void insertionSort(T[] data)

{

for (int index = 1; index < data.length; index++)

{

T key = data[index];

int position = index;

// shift larger values to the right

while (position > 0 && data[position-1].compareTo(key) > 0)

{

data[position] = data[position-1];

position--;

}

data[position] = key;

}

} 28

Insertion Sort - Implementation

Page 15: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

15

Insertion Sort - Implementation (cont…)

29

public static void insertionSort(int[] A,int length) {

for(int i = 1; i < length; i++)

{

int j = i;

int key = A[i];

while ((j > 0) && (A[j-1] > key))

{

A[j] = A[j-1];

j--;

}

A[j] = key;

}

}

The same implementation with some differences in the code

For example, consider this sorted array containing of eight sorted entries

Suppose we want to insert 14 into this array leaving the resulting array sorted

Starting at the back, if the number is greater than 14, copy it to the right

Once an entry less than 14 is found, insert 14 into the resulting vacancy

5 7 12 19 21 26 33 40 14 9 18 21 2

Insertion Sort - Example 1

30

Page 16: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

16

2

5

3

4

2

5

1

3

4

5

2

5

3

4

5

2

5

3

4

2

5

2 1

2

5

4

5

3

1

2

3

55

4

1

2

3

4

5

1

11

3

1

2

5

4

5

3

4

1

2

3

5

5

45

31

Insertion Sort - Example 2

(ordered) (reversed)(random)

best case avg case worst case

comparisons O(n) O(n2) O(n2)

movements O(n) O(n2) O(n2)

32

Insertion Sort: Computational Complexity

Page 17: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

17

Bubble sort orders a list of values by repetitively

comparing neighboring elements and swapping their

positions if necessary

Suppose we have an array of data which is unsorted:

Starting at the front, traverse the array, find the largest item,

and move (or bubble) it to the top

With each subsequent iteration, find the next largest item

and bubble it up towards the top of the array

It is also significantly worse than insertion sort

Bubble Sort

33

3

bubblesort(data[ ])

for i = 0 to data.length-2

for j = data.length-1 downto i+1

if elements in positions j and j-1 are out of order

swap them;

34

Algorithm:

Bubble Sort (cont…)

Page 18: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

18

Bubble Sort - Example

Consider the unsorted array to the right

We start with the element in the first location,

and move forward:

if the current and next items are in order,

continue with the next item, otherwise

swap the two entries

35

Bubble Sort - Example (cont…)

After one loop, the largest element

is in the last location

Repeat the procedure

36

Now the two largest elements are

at the end

Repeat again

Page 19: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

19

Bubble Sort - Example (cont…)

37

With this loop, 5 and 7 are

swapped

Finally, we swap the last two

entries to order them

At this point, we have a

sorted array

Bubble Sort - Implementation

Starting with the first item, assume that it is the largest

Compare it with the second item:

If the first is larger, swap the two,

Otherwise, assume that the second item is the largest

Continue up the array, either swapping or redefining the largest item

After one pass, the largest item must be the last in the list

Start at the front again:

the second pass will bring the second largest element into the second

last position

Repeat n – 1 times, after which, all entries will be in place

38

Page 20: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

20

/**

* Sorts the specified array of objects using a bubble sort

* algorithm.

*

* @param data the array to be sorted

*/

public static <T extends Comparable<T>>

void bubbleSort(T[] data)

{

int position, scan;

T temp;

for (position = data.length - 1; position >= 0; position--)

{

for (scan = 0; scan <= position - 1; scan++)

{

if (data[scan].compareTo(data[scan+1]) > 0)

swap(data, scan, scan + 1);

}

}

}

39

Bubble Sort - Implementation (cont…)

Bubble Sort - Implementation (cont…)

40

public static void bubbleSort( int a[], int length )

{

for(int i = 0; i < (length-1); i++)

{

for(int j = length-1; j > i; j--)

{

if(a[j-1] > a[j])

{

//... Exchange elements

int temp = a[j-1];

a[j-1] = a[j];

a[j] = temp;

}

}

}

}

The same implementation with some differences in the code

Page 21: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

21

2

3

4

1

5

5

3

4

1

2 1

2

4

3

5

1

2

3

4

5

1

2

3

4

5

1

2

3

4

5

2

5

1

3

4

1

2

3

4

5

41

Bubble Sort - Example

best case avg case worst case

comparisons O(n2) O(n2) O(n2)

movements 0 O(n2) O(n2)

(ordered) (random) (reversed)

42

Bubble Sort: Computational Complexity

Page 22: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

22

insertion best case avg case worst case

comparisons O(n) O(n2) O(n2)

movements O(n) O(n2) O(n2)

selection best case avg case worst case

comparisons O(n2) O(n2) O(n2)

movements 0 O(n) O(n)

bubble best case avg case worst case

comparisons O(n2) O(n2) O(n2)

movements 0 O(n2) O(n2)

43

Basic Sorting Algorithms: Comparison

Heap:

A heap is a binary tree that satisfies these special SHAPE and

ORDER properties:

Its shape must be a complete binary tree.

For each node in the heap, the value stored in that node is

greater than or equal to the value in each of its children.

Heap Sort 4

44

Page 23: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

23

Max-Heap & Min-Heap:

A heap can also be a min-heap, in which the node is less than

or equal to its children.

This means that the root of a max-heap contains the largest

element, whereas the root of a min-heap contains the smallest.

For the heapsort algorithm, we use max-heaps.

Min-heaps commonly implement priority queues.

Heap Sort (cont…)

45

70

60

40 30

12

8

root

The largest element in a max-heap is always found in the root node

10

Heap Sort (cont…)

46

Page 24: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

24

Heap Sort Approach

First, make the unsorted array into a heap by satisfying the order

property. Then repeat the steps below until there are no more

unsorted elements.

Take the root (maximum) element off the heap by swapping it into

its correct place in the array at the end of the unsorted elements.

Reheap the remaining unsorted elements. (This puts the next-

largest element into the root position).

Heap Sort (cont…)

47

heapsort(data[ ])

transform data[ ] into a heap;

for i = data.length-1 downto 2

swap the root with the element in position i;

restore the heap property for the tree data[0], …, data[i-1];

48

Heap Sort (cont…)

Algorithm:

Page 25: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

25

The heap can be stored in an array

Additionally, because arrays start at 0 (we started at entry 1 for binary heaps) ,

we need different formulas for the children and parent

we can easily compute the indices of its parent, left child, and right child:

Its left child is in A[i*2+1]

Its right child is in A[i*2+2]

Its parent is in A[(i-1)/2]49

Heap Sort (cont…)

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

70

60

12

40

30

8

10

values

70

0

60

1

40

3

30

4

12

2

8

5

root

10

6

Storing the data into an array as a heap structure

Heap Sort - Example

50

Page 26: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

26

After creating the original heap

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

70

60

12

40

30

6

10

values

70

0

60

1

40

3

30

4

12

2

6

5

root

10

6

Heap Sort - Example (cont…)

51

Swap root element into last place in unsorted array

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

70

60

12

40

30

6

10

values

70

0

60

1

40

3

30

4

12

2

6

5

root

10

6

Heap Sort - Example (cont…)

52

Page 27: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

27

After swapping root element into its place

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

10

0

60

1

40

3

30

4

12

2

6

5

root

70

6

10

60

12

40

30

6

70 NO NEED TO CONSIDER AGAIN

Heap Sort - Example (cont…)

53

After reheaping remaining unsorted elements

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

60

0

40

1

10

3

30

4

12

2

6

5

root

70

6

60

40

12

10

30

6

70

Heap Sort - Example (cont…)

54

Page 28: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

28

Swap root element into last place in unsorted array

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

60

0

40

1

10

3

30

4

12

2

6

5

root

70

6

60

40

12

10

30

6

70

Heap Sort - Example (cont…)

55

After swapping root element into its place

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

6

0

40

1

10

3

30

4

12

2

root

70

6

6

40

12

10

30

60

70 NO NEED TO CONSIDER AGAIN

60

5

Heap Sort - Example (cont…)

56

Page 29: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

29

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

40

0

30

1

10

3

6

4

12

2

root

70

6

40

30

12

10

6

60

70

60

5

After reheaping remaining unsorted elements

Heap Sort - Example (cont…)

57

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

40

0

30

1

10

3

6

4

12

2

root

70

6

40

30

12

10

6

60

70

60

5

Swap root element into last place in unsorted array

Heap Sort - Example (cont…)

58

Page 30: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

30

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

6

0

30

1

10

3

12

2

root

70

6

60

5

After swapping root element into its place

40

4

6

30

12

10

40

60

70 NO NEED TO CONSIDER AGAIN

Heap Sort - Example (cont…)

59

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

30

0

10

1

6

3

12

2

root

70

6

60

5

40

4

30

10

12

6

40

60

70

After reheaping remaining unsorted elements

Heap Sort - Example (cont…)

60

Page 31: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

31

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

30

0

10

1

6

3

12

2

root

70

6

60

5

40

4

30

10

12

6

40

60

70

Swap root element into last place in unsorted array

Heap Sort - Example (cont…)

61

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

6

0

10

1

12

2

root

70

6

60

5

40

4

After swapping root element into its place

6

10

12

30

40

60

70

30

3

NO NEED TO CONSIDER AGAIN

Heap Sort - Example (cont…)

62

Page 32: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

32

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

12

0

10

1

6

2

root

70

6

60

5

40

4

12

10

6

30

40

60

70

30

3

After reheaping remaining unsorted elements

Heap Sort - Example (cont…)

63

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

12

0

10

1

6

2

root

70

6

60

5

40

4

12

10

6

30

40

60

70

30

3

Swap root element into last place in unsorted array

Heap Sort - Example (cont…)

64

Page 33: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

33

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

6

0

10

1

root

70

6

60

5

40

4

30

3

After swapping root element into its place

NO NEED TO CONSIDER AGAIN

12

2

6

10

12

30

40

60

70

Heap Sort - Example (cont…)

65

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

10

0

6

1

root

70

6

60

5

40

4

30

3

12

2

10

6

12

30

40

60

70

After reheaping remaining unsorted elements

Heap Sort - Example (cont…)

66

Page 34: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

34

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

10

0

6

1

root

70

6

60

5

40

4

30

3

12

2

10

6

12

30

40

60

70

Swap root element into last place in unsorted array

Heap Sort - Example (cont…)

67

[ 0 ]

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

[ 5 ]

[ 6 ]

values

root

70

6

60

5

40

4

30

3

12

2

After swapping root element into its place

6

10

12

30

40

60

70

10

1

6

0

ALL ELEMENTS ARE SORTED

Heap Sort - Example (cont…)

68

Page 35: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

35

How many comparisons?

24

0

60

1

30

3

40

4

12

2

8

5

root

10

6

15

7

6

8

18

9

In reheap down, an

element is compared with

its 2 children (and swapped

with the larger). But only

one element at each level

makes this comparison,

and a complete binary tree

with N nodes has only

O(log2N) levels.70

10

Heap Sort - Example (cont…)

69

70

Heap Sort - Another Example

Page 36: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

36

71

Heap Sort - Another Example (cont…)

Heap Sort of N elements: How many comparisons?

(N/2) * O(log N) compares to create original heap

(N-1) * O(log N) compares for the sorting loop

= O ( N * log N) compares total

72

Heap Sort - Algorithm Analysis

Page 37: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

37

DCsorting(data[ ])

partition data[ ] into data1[ ] and data2[];

DCsorting(data1[ ]);

DCsorting(data2[ ]);

merge data1[] and data2[] into data[ ];

quicksort

mergesort

73

Divide-and-Conquer Sorting

Algorithm:

Quick Sort

Quick sort orders values by partitioning the list around

one element, then sorting each partition

More specifically:

choose one element in the list to be the partition element

organize the elements so that all elements less than the

partition element are to the left and all greater are to the right

apply the quick sort algorithm (recursively) to both partitions

74

5

Page 38: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

38

A . . Z

A . . L M . . Z

A . . F G . . L M . . R S . . Z

Quick Sort (cont…)

75

quicksort(data[ ])

if data.length > 1

choose pivot;

while there are elements left in data

include element either in

data1[ ] = {el: el ≤ pivot};

or in data2[ ] = {el: el ≥ pivot};

quicksort(data1[ ]);

quicksort(data2[ ]);

par

titi

on

ing

76

Quick Sort (cont…)

Algorithm:

Page 39: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

39

Quick Sort (cont…)

There are different strategy for selecting the split

value (pivot):

First element

Last element

Randomly

Median of three

77

Quick Sort (cont…)

For example, given

we can select the middle entry, 44, and sort the remaining entries

into two groups, those less than 44 and those greater than 44:

Notice that 44 is now in the correct location if the list was sorted

Proceed by applying the algorithm to the first six and last eight entries

80 38 95 84 66 10 79 44 26 87 96 12 43 81 3

38 10 26 12 43 3 44 80 95 84 66 79 87 96 81

78

Page 40: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

40

Quick Sort - Median-of-three

It is difficult to find the median so consider another

strategy:

Choose the median of the first, middle, and last entries in

the list

This will usually give a better approximation of the

actual median

79

Quick Sort - Median-of-three (cont…)

Sorting the elements based on 44 results in two sub-lists,

each of which must be sorted (again, using quicksort)

Select the 26 to partition the first sub-list:

Select 81 to partition the second sub-list:

Continue doing so until the appropriate entries you find are

actually in order

80

Page 41: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

41

/**

* Sorts the specified array of objects using the quick sort algorithm.

*

* @param data the array to be sorted

*/

public static <T extends Comparable<T>>

void quickSort(T[] data)

{

quickSort(data, 0, data.length - 1);

}

81

Quick Sort - Implementation

/**

* Recursively sorts a range of objects in the specified array using the

* quick sort algorithm.

*

* @param data the array to be sorted

* @param min the minimum index in the range to be sorted

* @param max the maximum index in the range to be sorted

*/

private static <T extends Comparable<T>>

void quickSort(T[] data, int min, int max)

{

if (min < max)

{

// create partitions

int indexofpartition = partition(data, min, max);

// sort the left partition (lower values)

quickSort(data, min, indexofpartition - 1);

// sort the right partition (higher values)

quickSort(data, indexofpartition + 1, max);

}

}82

Quick Sort - Implementation (cont…)

Page 42: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

42

/**

* Used by the quick sort algorithm to find the partition.

*

* @param data the array to be sorted

* @param min the minimum index in the range to be sorted

* @param max the maximum index in the range to be sorted

*/

private static <T extends Comparable<T>>

int partition(T[] data, int min, int max)

{

T partitionelement;

int left, right;

int middle = (min + max) / 2;

// use the middle data value as the partition element

partitionelement = data[middle];

// move it out of the way for now

swap(data, middle, min);

left = min;

right = max;

83

Quick Sort - Implementation (cont…)

while (left < right)

{

// search for an element that is > the partition element

while (left < right && data[left].compareTo(partitionelement) <= 0)

left++;

// search for an element that is < the partition element

while (data[right].compareTo(partitionelement) > 0)

right--;

// swap the elements

if (left < right)

swap(data, left, right);

}

// move the partition element into place

swap(data, min, right);

return right;

}

84

Quick Sort - Implementation (cont…)

Page 43: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

43

N For first call, when each of N elements is compared to

the split value

2 * N/2 For the next pair of calls, when N/2 elements in each “half”

of the original array are compared to their own split values.

4 * N/4 For the four calls when N/4 elements in each “quarter” of

original array are compared to their own split values.

.

.

.

HOW MANY SPLITS CAN OCCUR?

Quick Sort of N Elements: How many comparisons?

85

It depends on the order of the original array elements!

If each split divides the subarray approximately in half, there

will be only log2N splits, and QuickSort is O(N*log2N).

But, if the original array was sorted to begin with, the recursive

calls will split up the array into parts of unequal length, with

one part empty, and theother part containing all the rest of the

array except for split value itself. In this case, there can be as

many as N-1 splits, and QuickSort is O(N2).

Quick Sort of N Elements: How many splits can occur?

86

Page 44: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

44

Merge Sort

Merge sort orders values by recursively dividing the list in half

until each sub-list has one element, then recombining

More specifically:

divide the list into two roughly equal parts

recursively divide each part in half, continuing until a part contains

only one element

merge the two parts into one sorted list

continue to merge parts as the recursion unfolds

This is the a divide-and-conquer algorithm87

6

Merge Sort (cont…)

Dividing lists in half repeatedly:

88

Page 45: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

45

Merge Sort (cont…)

Merging sorted elements

89

mergesort(data[ ], first, last)

if first < last

mid = (first + last) / 2;

mergesort(data[ ], first, mid);

mergesort(data[ ], mid+1, last);

merge(data[ ], first, last);

partitioning

merging

90

Merge Sort (cont…)

Algorithm:

Page 46: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

46

2 4 9 5 5 7 3 6 2

2 4 9 5 5 7 3 6 2

2 4 9

2 4 9 5

6 2

2 2 3 4 5 5 6 7 9

5 5 7 3

5

2 4

2 4 9 5 5

2 4 5 5 9

3 7 2 6

2 3 6 7

6 27 3

2 4

91

Merge Sort - Example 1

92

Merge Sort - Example 2

Page 47: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

47

/**

* Sorts the specified array of objects using the merge sort

* algorithm.

*

* @param data the array to be sorted

*/

public static <T extends Comparable<T>>

void mergeSort(T[] data)

{

mergeSort(data, 0, data.length - 1);

}

/**

* Recursively sorts a range of objects in the specified array using the

* merge sort algorithm.

*

* @param data the array to be sorted

* @param min the index of the first element

* @param max the index of the last element

*/

private static <T extends Comparable<T>>

void mergeSort(T[] data, int min, int max)

{

if (min < max)

{

int mid = (min + max) / 2;

mergeSort(data, min, mid);

mergeSort(data, mid+1, max);

merge(data, min, mid, max);

}

}

93

Merge Sort - Implementation (cont…)

/**

* Merges two sorted subarrays of the specified array.

*

* @param data the array to be sorted

* @param first the beginning index of the first subarray

* @param mid the ending index fo the first subarray

* @param last the ending index of the second subarray

*/

@SuppressWarnings("unchecked")

private static <T extends Comparable<T>>

void merge(T[] data, int first, int mid, int last)

{

T[] temp = (T[])(new Comparable[data.length]);

int first1 = first, last1 = mid; // endpoints of first subarray

int first2 = mid+1, last2 = last; // endpoints of second subarray

int index = first1; // next index open in temp array

// Copy smaller item from each subarray into temp until one

// of the subarrays is exhausted

while (first1 <= last1 && first2 <= last2)

{

if (data[first1].compareTo(data[first2]) < 0)

{

temp[index] = data[first1];

first1++;

}

94

Merge Sort - Implementation (cont…)

Page 48: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

48

else

{

temp[index] = data[first2];

first2++;

}

index++;

}

// Copy remaining elements from first subarray, if any

while (first1 <= last1)

{

temp[index] = data[first1];

first1++;

index++;

}

// Copy remaining elements from second subarray, if any

while (first2 <= last2)

{

temp[index] = data[first2];

first2++;

index++;

}

// Copy merged data into original array

for (index = first; index <= last; index++)

data[index] = temp[index];

}

95

Merge Sort - Implementation (cont…)

Merging Example

Consider the two sorted arrays and an empty array

Define three indices at the start of each array

96

Page 49: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

49

Merging Example (cont…)

We compare 2 and 3: 2 < 3

Copy 2 down

Increment the corresponding indices

97

Merging Example (cont…)

We compare 3 and 7

Copy 3 down

Increment the corresponding indices

98

Page 50: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

50

Merging Example (cont…)

We compare 5 and 7

Copy 5 down

Increment the appropriate indices

99

Merging Example (cont…)

We compare 18 and 7

Copy 7 down

Increment...

100

Page 51: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

51

Merging Example (cont…)

We compare 18 and 12

Copy 12 down

Increment...

101

Merging Example (cont…)

We compare 18 and 16

Copy 16 down

Increment...

102

Page 52: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

52

Merging Example (cont…)

We compare 18 and 33

Copy 18 down

Increment...

103

Merging Example (cont…)

We compare 21 and 33

Copy 21 down

Increment...

104

Page 53: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

53

Merging Example (cont…)

We compare 24 and 33

Copy 24 down

Increment...

105

Merging Example (cont…)

We would continue until we have passed beyond the limit of one of the

two arrays

After this, we simply copy over all remaining entries in the non-empty

array

106

Page 54: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

54

The entire array can be subdivided into halves only log2N times.

Each time it is subdivided, function Merge is called to re-combine

the halves.

Function Merge uses a temporary array to store the merged

elements.

Merging is O(N) because it compares each element in the

subarrays.

Copying elements back from the temporary array to the values

array is also O(N).

MERGE SORT IS O(N*log2N).

Merge Sort of N elements: How many comparisons?

107

Comparing Sorts

Selection sort, insertion sort, and bubble sort use different

techniques, but are all O(n2)

They are all based in a nested loop approach

In quick sort, if the partition element divides the elements in half,

each recursive call operates on about half the data

The act of partitioning the elements at each level is O(n)

The effort to sort the entire list is O(n log n)

It could deteriorate to O(n2) if the partition element is poorly chosen

108

Page 55: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

55

Comparing Sorts (cont…)

Merge sort divides the list repeatedly in half, which

results in the O(log n) portion

The act of merging is O(n)

So the efficiency of merge sort is O(n log n)

Selection, insertion, and bubble sorts are called

quadratic sorts

Quick sort and merge sort are called logarithmic sorts

109

Summary

Insertion Sort:

Insert new entries into growing sorted lists

Actual and average case run time: O(n2)

From the description of bubble sort, it sounds as if it is as good as insertion sort

it has the same asymptotic behavior in practice, however, it is significantly worse

it is also much more difficult to code...

Selection sort, insertion sort, and bubble sort use different techniques, but are all O(n2)

We have seen heap sort algorithm - O(n ln(n)) :

Convert the unsorted list into a max-heap as complete array

Pop the top n times and place that object into the vacancy at the end

It requires O(1) additional memory—it is truly in-place

It is a nice algorithm; however, we will see two other faster n ln(n) algorithms; however:

Merge sort requires O(n) additional memory

Quick sort requires O(ln(n)) additional memory110

Page 56: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

56

Summary (cont…)

We covered quicksort:

On average faster than heap sort or merge sort

Uses a pivot to partition the objects

Using the median of three pivots is a reasonably means of finding the pivot

Average run time of O(n ln(n)) and O(ln(n)) memory

Worst case run time of O(n2) and O(n) memory

We covered mergesort:

This is the a divide-and-conquer algorithm

Each time it is subdivided, function Merge is called to re-combine the halves.

Function Merge uses a temporary array to store the merged elements.

So the efficiency of merge sort is O(n log n)

Merge sort requires O(n) additional memory

111

References

Java Software Structures - Designing and Using Data Structures, 4th

edition, Lewis and Chase.

Data Structures & Algorithms in Java, 4th edition, Drozdek.

Data Structures and Problem Solving Using Java, 4th edition, Weiss.

Slides at: https://ece.uwaterloo.ca/~dwharder/aads/Lecture_materials/

Douglas Wilhelm Harder, Mmath, University of Waterloo.

Slides at: http://faculty.kfupm.edu.sa/ICS/jauhar/ics202/

112

Page 57: Searching and Sorting - rana-tarabishi.com · Selection Sort Insertion Sort ... * Sorts the specified array of integers using the selection * sort algorithm. * * @param data the array

57

Any Question

???

113