Intro to Computer Science II

157
1 Intro to Computer Science II Chapter 12 Searching and Sorting Algorithms With an introduction to algorithm efficiency

description

Intro to Computer Science II. Chapter 12 Searching and Sorting Algorithms With an introduction to algorithm efficiency. FROM CHAPTER 8. Maximum array element. >= finds last one. FROM CHAPTER 8. MaxFinder class. public class MaxFinder { public int findMaximum(double[] a) { - PowerPoint PPT Presentation

Transcript of Intro to Computer Science II

Page 1: Intro to Computer Science II

1

Intro to Computer Science II

Chapter 12Searching and Sorting

Algorithms

With an introduction to algorithm efficiency

Page 2: Intro to Computer Science II

2BGA

Maximum array element

index

kindex

aa

nk

index

aaa

indexk

n

1 1

0

),,,(mFindMaximu 110

RETURN

FOR END

IF END

THENIF

DOTOFOR

ALGORITHM

FROM CHAPTER 8

>= findslast one

Page 3: Intro to Computer Science II

3BGA

MaxFinder class

public class MaxFinder{ public int findMaximum(double[] a) { int index = 0; for (int k = 1; k <= a.length - 1; k++) { if (a[k] > a[index]) index = k; } return index; }}

FROM CHAPTER 8

Page 4: Intro to Computer Science II

4BGA

Maximum account balance

public int findMaximum(BankAccount[] a){ int index = 0; for (int k = 1; k <= a.length - 1; k++) { if (a[k].getBalance() > a[index].getBalance()) index = k; } return index;}

FROM CHAPTER 8

Page 5: Intro to Computer Science II

5BGA

lexigraphically largest string

public int findMaximum(String[] a){ int index = 0; for (int k = 1; k <= a.length - 1; k++) { if (a[k].compareTo(a[index]) > 0) index = k; } return index;}

FROM CHAPTER 8

Page 6: Intro to Computer Science II

6BGA

Linear search

Problem Given the array and a

value x to find, determine the index i such that and .

If such an index cannot be found let the index be -1.

110 ,,, naaa

xai 10 ni

FROM CHAPTER 8

Page 7: Intro to Computer Science II

7BGA

Linear search algorithm

IF END

RETURN

ELSE

RETURN

IF

WHILEEND

DOWHILE

ALGORITHM

index

nindex

indexindex

xanindex

index

x,a,,aa

index

n

1

THEN 1

1

)()1(

0

, ch LinearSear 110

FROM CHAPTER 8

Page 8: Intro to Computer Science II

8BGA

LinearSearcher class

public class LinearSearcher{ public int search(double[] a, double x) { int index = 0; int n = a.length; while (index < n && a[index] != x) { index = index + 1; } if (index > n-1) return -1; else return index; }}

FROM CHAPTER 8

Page 9: Intro to Computer Science II

9BGA

Bubble sort algorithm

Sort array in increasing order: Pass 1: Process the array elements to

exchanging elements that are out of order: if swap them, if swap them,...,

if swap them . At end of this pass the largest array element will be in the last position, its correct position.

Pass 2: process to in the same way Pass n-1: process to

110 ,,, naaa

0a 1na

10 aa 21 aa

12 nn aa

0a 2na

0a 1a

FROM CHAPTER 8

Page 10: Intro to Computer Science II

10BGA

Pseudo-code loop for passes

FOR END

DOTOFOR

order ofout are that elements swapping

),1(,),2,1(),1,0( positionsat pairs Compare

1 1

pnpn

np

)1,0( positionsat elements Compare )1(

...

),1(,),2,1(),1,0( positonsat elements Compare )(

...

)3,4(,),2,1(),1,0( positionsat elements Compare )3(

)2,3(,),3,2(),2,1(),1,0( postionsat elements Compare (2)

)1,2(,),3,2(),2,1(),1,0( positionsat elements Compare (1)

n

pnpnp

nn

nn

nn

FROM CHAPTER 8

Page 11: Intro to Computer Science II

11BGA

Example

Pass

Start of pass 1 44 55 12 42 94 18 6 67 Start of pass 2 44 12 42 55 18 6 67 94Start of pass 3 12 42 44 18 6 55 67 94Start of pass 4 42 12 18 6 44 55 67 94Start of pass 5 12 18 6 42 44 55 67 94Start of pass 6 12 6 18 42 44 55 67 94Start of pass 7 6 12 18 42 44 55 67 94 End of pass 7 6 12 18 42 44 55 67 94

0a 1a 2a 3a 4a 5a 6a 7a

FROM CHAPTER 8

Page 12: Intro to Computer Science II

12BGA

Bubble sort algorithm

FOR END

FOR END

IF END

THENIF

DOTOFOR

DOTOFOR

ALGORITHM

),swap(

1 0

1 1

,,, bubbleSort

1

1

110

jj

jj

n

aa

aa

pnj

np

aaa

FROM CHAPTER 8

Page 13: Intro to Computer Science II

13BGA

BubbleSorter class

public class BubbleSorter{ public double[] bubbleSort(double[] a) { int n = a.length; for (int p = 1; p <= n - 1; p++) { for (int j = 0; j <= n-1-p; j++) { if (a[j] > a[j + 1]) { double temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } return a; // so we can test in BlueJ } }

FROM CHAPTER 8

Page 14: Intro to Computer Science II

14BGA

Sorting an array of strings

public void bubbleSort(String[] a){ int n = a.length; for (int p = 1; p <= n - 1; p++) { for (int j = 0; j <= n - 1 - p; j++) { if(a[j].compareTo(a[j+1]) > 0) { String temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } }}

Note thatwe are notswappingstring objectshere.

We areswapping thereferences tothe strings

FROM CHAPTER 8

Page 15: Intro to Computer Science II

15

Intro to Computer Science II

Chapter 12Searching and Sorting

Algorithms

With an introduction to algorithm efficiency

Page 16: Intro to Computer Science II

16BGA

Min & Max algorithms

Minimum and maximum algorithms using subarrays (more general)

A subarray of an arrayis the sequence with

We consider only the min algorithms since the max algorithms are easily obtained by reversing inequalities in comparisons

110 ,,, naaa endstart aa ,,

10 nendstart

Page 17: Intro to Computer Science II

17BGA

Minimum algorithms (1)

The index i is not unique: minimum value can occur several times:

Do we return the minimum value or the index at which it occurs?

.

,..., 10

endkstartkaaendistarti

endstartaa

ki

n

that such all for and that such index an determine

subarray, a defining and valuesindex the and array the Given :Problem

Page 18: Intro to Computer Science II

18BGA

Minimum algorithms (2)

index

kindexaa

endstartkstartindex

endstartaa

indexk

n

RETURNFOR END

IF END

THEN IF DO TO FOR

mFindMinimu ALGORITHM

1

),,,...,( 10

Page 19: Intro to Computer Science II

19BGA

Minimum algorithms (3)

int findMinimum(int[] a, int start, int end){ int index = start; for (int k = start + 1; k <= end; k++) { if ( a[k] < a[index] ) index = k; } return index;}

Return index of first occurrence of minimum value

Page 20: Intro to Computer Science II

20BGA

Minimum algorithms (4)

int findMinimum(int[] a, int start, int end){ int index = start; for (int k = start + 1; k <= end; k++) { if ( a[k] <= a[index] ) index = k; } return index;}

Return index of last occurrence of minimum value

only difference

Page 21: Intro to Computer Science II

21BGA

Minimum algorithms (5)

int findMinimum(int[] a, int start, int end){ int min = a[start]; for (int k = start + 1; k <= end; k++) { if ( a[k] <= min ) min = a[k]; } return min;}

Return minimum value itself instead of index

Page 22: Intro to Computer Science II

22BGA

Minimum algorithms (6)

int[] scores = {56,32,27,98,27,57,68,28,45,65};

int pos = findMinimum(score, 0, score.length - 1);

System.out.println("Position of minimum is " + pos);System.out.println("Minimum value is " + score[pos]);

Example using findMinimum (index version)

Page 23: Intro to Computer Science II

23BGA

Minimum algorithms (7)

int findMinimumBalance(BankAccount[] a, int start, int end){ int index = start; for (int k = start + 1; k <= end; k++) { if ( a[k].getBalance() < a[index].getBalance() ) index = k; } return index;}

Can easily modify algorithm for other types of arrays

returns index of BankAccount with the minimum balance

Page 24: Intro to Computer Science II

24BGA

Running time (1)

Let T(n) be the time to find the minimum in an n element subarray (n = end - start + 1).

For findMinimum the running time increases linearly with n: T(n) = an + b for some constants a and b

The constants a and b depend on the particular computer system running an implementation of the algorithm

Page 25: Intro to Computer Science II

25BGA

Running time (2)

We need a way to measure the running time of an algorithm in a machine independent way.

We need to eliminate the constants a and b that are machine dependent

We also need to find a measure of time that doesn't use physical units such as seconds

Page 26: Intro to Computer Science II

26BGA

Running time (3)

For findMinimum we can choose the number of times the for-loop is executed (number of times the if statement is executed). In this case T(n) = n - 1

We say that all algorithms whose running time is T(n) = an + b are O(n) algorithms (Big O notation) and we write T(n) = O(n)

Page 27: Intro to Computer Science II

27BGA

Running time (4)

The best, average, and worst case behaviour of an algorithm can also be used to describe the running time.

For finding the minimum they are all O(n).

Page 28: Intro to Computer Science II

28BGA

Mathematical Definition

Given two functions f and g we say that f(n) = O(g(n)) if there are constants c > 0 and N > 0 such that for all n > N. There are other measures of the rate of growth of a function but we will not consider them here.

Example: The functions an+b, n, n / 2 are all O(n) and the functions are all

cbnan 2 )( 2nO

)()(0 ncgnf

Page 29: Intro to Computer Science II

29BGA

Searching Algorithms (1)

We consider three searching algorithms Linear search (version done in Chapter

8) Recursive binary search Non-recursive binary search We develop algorithms for int arrays.

They can easily be modified for other array types

We also use array slices.

Page 30: Intro to Computer Science II

30BGA

Linear search algorithm (1)

.1

.,...,

,..., 10

beindex the let found be cannotindex an such If

and that such index andetermine find, to value a and

subarray a defining and valuesindex the and array the Given :Problem

endistartxaixaa

endstartaa

i

endstart

n

Page 31: Intro to Computer Science II

31BGA

Linear search algorithm (2a)

IF END

RETURN

ELSE

RETURN

THENIF

WHILEEND

DOWHILE

chLinearSearALGORITHM

index

-

endindex

indexindex

xaendindex

startindex

endstartxaa

index

n

1

1

),,,,...,( 10

so that we don't gooff the end of the slice

harder to understandthan the FOR loop

version with RETURNstatement

Page 32: Intro to Computer Science II

32BGA

Linear search algorithm (2b)

1

1

),,,,...,( 10

-

indexindex

index

xa

endindex

startindex

endstartxaa

index

n

RETURN

WHILEEND

IF END

RETURN

THENIF

DOWHILE

chLinearSearALGORITHM

simpler version usingRETURN statementin the WHILE loop

Page 33: Intro to Computer Science II

33BGA

Linear search algorithm (2c)

1

),,,,...,( 10

-

index

xa

endstartindex

endstartxaa

index

n

RETURN

FOR END

IF END

RETURN

THENIF

DOTOFOR

chLinearSearALGORITHM

Another version using aRETURN statement in a

FOR loop

Page 34: Intro to Computer Science II

34BGA

Linear search algorithm (3)

The best case (x is first array element) T(n) = O(1) (doesn't depend on n)

The worst case (x is the last array element) T(n) = O(n)

The average case can be shown to have T(n) = O(n)

Here n = end - start + 1

Page 35: Intro to Computer Science II

35BGA

IntArraySearch class

public class IntArraySearch{ public static int linearSearch(int[] a, int x, int start, int end) { int i = start; while ( (i <= end) && (a[i] != x)) i++; if (i <= end) return i; else return -1; }}

For testing we can put Java implementations of our search algorithms, as we develop them, in a class as static methods

Page 36: Intro to Computer Science II

36BGA

Alternate version (for loop)

public static int linearSearch(int[] a, int x, int start, int end){ for (int i = start; i <= end; i++) { if (a[i] == x) return i; } return -1;}

A for loop can be used to do linear search. This version may be easier to understand.

Page 37: Intro to Computer Science II

37BGA

Class IntArraySearchTester (1)

package chapter12.searching;import java.util.Scanner

public class IntArraySearchTester{ public void doTest() { Scanner input = new Scanner(System.in);

// first read the array

Page 38: Intro to Computer Science II

38BGA

Class IntArraySearchTester (2)

// First read the array size

System.out.print("Enter array size: "); int size = input.nextInt(); input.nextLine(); int[] testArray = new int[size];

// Now read the array elements

for (int k = 0; k < testArray.length; k++) { System.out.print("Enter element " + k + ": "); testArray[k] = input.nextInt(); input.nextLine(); }

Page 39: Intro to Computer Science II

39BGA

Class IntArraySearchTester (3)

// Read element to find

System.out.print("Enter element to find: "); int x = input.nextInt(); input.nextLine();

// Read the start and end indices

System.out.print("Enter start index: "); int start = input.nextInt(); input.nextLine(); System.out.print("Enter end index: "); int end = input.nextInt(); input.nextLine();

Page 40: Intro to Computer Science II

40BGA

Class IntArraySearchTester (4)

// Search array and display result int pos; pos = IntArraySearch.linearSearch( testArray, x, start, end); displayResult(pos, x); pos = IntArraySearch.rBinarySearch( testArray, x, start, end); displayResult(pos, x); pos = IntArraySearch.nRbinarySearch( testArray, x, start, end); displayResult(pos, x);

} // end doTest

test all search

methods in one class

Page 41: Intro to Computer Science II

41BGA

Class IntArraySearchTester (5)

} // end doTest public void displayResult(int pos, int x) { if (pos < 0) System.out.println("Element " + x + " was not found"); else System.out.println("Element " + x + " was found at position " + pos); }

public static void main(String[] args) { new IntArraySeachTester().doTest(); }} // end of class

Page 42: Intro to Computer Science II

42BGA

Recursive binary search (1)

Array must be sorted in some order Sometimes called the phone book

algorithm Open book in middle Decide if you should search left or right

half and then search this half Recursive description: to search an

array search one of the two subarrays obtained by dividing the array in half

Page 43: Intro to Computer Science II

43BGA

Recursive binary search (2)

Start with an array slice

We want to determine if x is found in this subarray

To begin each bisection step we choose the middle subarray element

endstartstartendstart aaaaa 1,, where,

2/)( endstartmidamid where,

Page 44: Intro to Computer Science II

44BGA

Recursive binary search (3)

There are two base cases:

There are two recursive cases:

found) not empty,(subarray xendstart

found) been has ( xax mid

) subarray left (search 1,, midstartmid aaax

) subarray right (search endmidmid aaax ,,1

Page 45: Intro to Computer Science II

45BGA

Example for integer array

Find 56 in <3,5,7,11,21,47,56,63,84,89>

Step Left subarray Middle Right subarray

1 <3,5,7,11> 21 <47,56,63,84,89> 2 <47,56> 63 <84,89> 3 < > 47 <56> 4 < > 56 < >

Page 46: Intro to Computer Science II

46BGA

Running time estimate (1)

Running time is proportional to the number of bisections that are made and this is proportional to the number of comparisons of x with

Example: 10 element array (4 bisections)

Example: 1000 element array (10 bisections)

mida

123510

12481632631252505001000

Page 47: Intro to Computer Science II

47BGA

Running time estimate (2)

Comparison of linear and binary search

1331010

301010

201010

1010001000

7100100

41010

4040

99

66

BinaryLinearn binary search ismuch more

efficient thanlinear search

2ln/lnlog2 nn

Page 48: Intro to Computer Science II

48BGA

Binary Search Algorithm

IF END

IF END )ch(BinarySear RETURN

ELSE )ch(BinarySear RETURN

THEN IF ELSE RETURN

THEN IF ELSE

RETURN THEN IF)ch(BinarySear ALGORITHM

xaa

xaaaxmid

axendstartmid

endstartxaa

endmid

midstart

mid

mid

endstart

,,,

,,,

2/)(

1,,,

1

1

Page 49: Intro to Computer Science II

49BGA

Java method

public static int rBinarySearch(int[] a, int x, int start, int end){ if (start <= end) { int mid = (start + end) / 2; if (x < a[mid]) // search left half return rBinarySearch(a, x, start, mid-1); else if (x > a[mid]) // search right half return rBinarySearch(a, x, mid+1, end); else // x found and x = a[mid] return mid; } return -1;}

Page 50: Intro to Computer Science II

50BGA

IntArraySearch class

public class IntArraySearch{ public static int linearSearch(int[] a, int x, int start, int end) { ... }

public static int rBinarySearch(int[] a, int x, int start, int end) { ... }}

Put the Java implementation in the IntArraySearch class along with the linear version

Page 51: Intro to Computer Science II

51BGA

Non-recursive binary search

Keep track of two indices low and high that define the subarray to search

Initially let low=start and high=end If left half is chosen adjust high to mid-1 If right half is chosen adjust low to mid +1 As the bisection process proceeds, low

increases and high decreases When low > high the algorithm terminates

highlow aa ,,

Page 52: Intro to Computer Science II

52BGA

Find 56 in the array (low=0, high=10)

1 3 5 7 11 21 47 56 63 84 89

low=0 high=10

low=6 high=10

low=6 high=7

low,high=7 (found it)

Example

Page 53: Intro to Computer Science II

53BGA

Java method

public static int nrBinarySearch(int[] a, int x, int start, int end){ int low = start, high = end; while (low <= high) { int mid = (low + high) / 2; if (x < a[mid]) // left half high = mid - 1; else if (x > a[mid]) // right half low = mid + 1; else return mid; } return -1; // x not found}

Page 54: Intro to Computer Science II

54BGA

IntArraySearch class

public class IntArraySearch{ public static int linearSearch(int[] a, int x, int start, int end) { ... }

public static int rBinarySearch(int[] a, int x, int start, int end) { ... }

public static int nrBinarySearch(int[] a, int x, int start, int end) { ... }}

Put the Java implementation in the IntArraySearch class along with the linear and recursive versions

Page 55: Intro to Computer Science II

55BGA

Binary search is O(log n) (1)

Assume that n is a power of 2: Then we can search a subarray of n

elements in T(n) time. From the recursive version of the algorithm this should be 1 + T(n /2) since we do one comparison to determine which half to search and T(n /2) comparisons to search this half. Therefore T(n) = T(n /2) + 1

mn 2

Page 56: Intro to Computer Science II

56BGA

Binary search is O(log n) (2)

)(log)(

log1)(

1)(

2 since ,)1()(

)2/()(

...

3)2/(21)2/()(

2)2/(11)2/()(

1)1( where,1)2/()(

2

2

33

22

nOnT

nnT

mnT

nmTnT

mnTnT

nTnTnT

nTnTnT

TnTnT

m

m

Page 57: Intro to Computer Science II

57

Intro to Computer Science II

Sorting Algorithms

Page 58: Intro to Computer Science II

58BGA

Sorting algorithms (1)

Sorting is a very common operation in data processing. There are many algorithms.

We consider four algorithms for integer arrays selection sort (average case ) inefficient insertion sort (average case ) inefficient bubble sort (average case ) inefficient quicksort (average case ) efficient mergesort (average case ) efficient

)( 2nO

)( 2nO

)log( nnO

)log( nnO

)( 2nO

Page 59: Intro to Computer Science II

59BGA

Sorting algorithms (2)

Each sorting method starts with an array slice

and sorts it in increasing order so that when the algorithm finishes we have

The algorithms are easily modified to sort other array types in another order (e.g. decreasing)

10,,, nstartaa endstart where

endstartstartstart aaaa 21

Page 60: Intro to Computer Science II

60BGA

Selection sort process (1)

Find smallest element inand swap (exchange) it with element at position start so is now the smallest element.

Find smallest element in and swap (exchange) it with element at position start+1 so are the smallest two elements.

Repeat until is last subarray

endstart aa ,,

starta

endstart aa ,,1

1, startstart aa

endend aa ,1

Page 61: Intro to Computer Science II

61BGA

Selection sort process (2)

Sorted part of array Unsorted part of array

endstart aa ,,

)1()1(1 ,, endstart aa

)2()2(1 , n

endn

end aa

)1(

starta

)2(1

)2( , startstart aa )2()2(

2 ,, endstart aa

)2(2

)2( ,, nend

nstart aa

)1(1

)1( ,, nend

nstart aa )1(n

enda

Page 62: Intro to Computer Science II

62BGA

Sort the array <44, 55, 12, 42, 94, 18, 6, 67>Step operation 1 44 55 12 42 94 18 6 67 swap 6 with 44 2 6 55 12 42 94 18 44 67 swap 12 with 55 3 6 12 55 42 94 18 44 67 swap 18 with 55 4 6 12 18 42 94 55 44 67 swap 42 with

itself 5 6 12 18 42 94 55 44 67 swap 44 with 94 6 6 12 18 42 44 55 94 67 swap 55 with

itself 7 6 12 18 42 44 55 94 67 swap 67 with 94 8 6 12 18 42 44 55 67 94 done

Selection sort example

0a 1a 2a 3a 4a 5a 6a 7a

Page 63: Intro to Computer Science II

63BGA

Top level pseudo-code

Top level pseudo-code algorithm for selection sort is

FOR TO DO Find index k of smallest element in Exchange (swap) elements at positions i

and kEND FOR

endi aa ,,starti 1end

Page 64: Intro to Computer Science II

64BGA

SelectionSort algorithm

FOR END

FOR END IF END

THEN IF

DO TO FOR

DO TO FOR )ort(selectionS ALGORITHM

tempaaa

atemp

jk

aaendij

ikendstarti

endstartaa

i

ik

k

kj

endstart

1

1,,,,

This is just the findminimum algorithmapplied to the slicebeginning at index i and ending at indexend

Page 65: Intro to Computer Science II

65BGA

Java method

public static void selectionSort(int[] a, int start, int end){ for (int i = start; i < end; i++) { int k = i; for (int j = i + 1; j <= end; j++) { if ( a[j] < a[k] ) k = j; } int temp = a[k]; // swap a[k] = a[i]; a[i] = temp; }}

Page 66: Intro to Computer Science II

66BGA

IntArraySort class

public class IntArraySort{ public static void selectionSort(int[] a, int start, int end) { ... }}

Put the Java implementation in the IntArraySort class

This method is tested in the SortTester class

Page 67: Intro to Computer Science II

67BGA

Selection sort running time (1)

outer loop inner loop inner loopindex index executionsstart start + 1 ,...,end end-start = n-1start + 1 start + 2, ...,end end-start-1 = n-2start + 2 start + 3, ...,end end-start-2 = n-3... ... ...end - 1 end, ..., end 1

Page 68: Intro to Computer Science II

68BGA

Selection sort running time (2)

Adding the number of inner loop executions:

T(n) = 1 + 2 + 3 + ... + n-1T(n) = n-1 + n-2 + n-3 + ... + 12T(n) = n + n + n + ... + n

Therefore )(

2

1

2

1

2

)1()( 22 nOnn

nnnT

Page 69: Intro to Computer Science II

69BGA

Insertion sort process (1)

Start with the array slice Divide it into two parts: a left part L

which is already sorted and a right part R which is unsorted.

Initially we let

endstart aa ,,

startaL endstart aaR ,,1

Page 70: Intro to Computer Science II

70BGA

Insertion sort process (2)

Starting with

take the first element of R and move it to its proper place in L to give

where

)1(

1)1( , startstart aaL endstart aaR ,,2

startaL endstart aaR ,,1

)1(1

)1( startstart aa

Page 71: Intro to Computer Science II

71BGA

Insertion sort process (3)

After several steps we obtain

and

where

)1(1

)1( ,..., startii

startistart aaL

endi aaR ,,

)1(1

)1(

startii

startistart aa

Page 72: Intro to Computer Science II

72BGA

Insertion sort process (4)

For

we need to move to its correct place in L.

This is done, beginning at the right end of L, by moving the elements of L to the right one place until the correct "hole" is found for

This is called a "move and drop" technique

)1(1

)1( ,..., startii

startistart aaL endi aaR ,,

ia

ia

Page 73: Intro to Computer Science II

73BGA

Insertion sort example

step array operation

1 44 | 55 12 42 94 18 6 67 put 55 in L 2 44 55 | 12 42 94 18 6 67 put 12 in L 3 12 44 55 | 42 94 18 6 67 put 42 in L 4 12 42 44 55 | 94 18 6 67 put 94 in L 5 12 42 44 55 94 | 18 6 67 put 18 in L 6 12 18 42 44 55 94 | 6 67 put 6 in L 7 6 12 18 42 44 55 94 | 67 put 67 in L 8 6 12 18 42 44 55 67 94 done

0a 1a 2a 3a 4a 5a 6a 7a

The vertical bars indicate the division between L and R parts

Page 74: Intro to Computer Science II

74BGA

Insertion sort algorithm

FOR END

WHILEEND

DO WHILE

DO TO FOR )ort(insertionS ALGORITHM

xa

jj

aa

axstartjijax

endstartiendstartaa

j

jj

j

i

n

1

1

10

1

1

1,,,,

left element of unsorted part

right index of sorted part

Page 75: Intro to Computer Science II

75BGA

Java method

public static void insertionSort(int[] a, int start, int end){ // sorted part is a[start], ..., a[i-1] // unsorted part is a[i] to a[end]

for (int i = start + 1; i <= end; i++) { int x = a[i]; // left element of unsorted part int j = i - 1; // right index of sorted part // move element right to find position for x while ( (j >= start) && (x < a[j]) ) { a[j+1] = a[j]; // move a[j] to right j--; } a[j+1] = x; // drop x into hole found }}

Page 76: Intro to Computer Science II

76BGA

IntArraySort class

public class IntArraySort{ public static void selectionSort(int[] a, int start, int end) { ... }

public static void insertionSort(int[] a, int start, int end) { ... }}

Put the Java implementation in the IntArraySort class

This method is tested in the SortTester class

Page 77: Intro to Computer Science II

77BGA

Insertion sort running time (1)

outer loop inner loop inner loop

index index executionsstart + 1 start,...,start 1start + 2 start, ...,start +1 2start + 3 start, ...,start +2 3... ... ...end start, ..., end -1 end - start

Page 78: Intro to Computer Science II

78BGA

Insertion sort running time (2)

The worst case behaviour (while loop executes the maximum number of times when array is sorted in reverse order):

Can be shown that the average time is also

sizearray the is where 1

)(2

)1(21)( 2

startendn

nOnn

startendnT

)( 2nO

Page 79: Intro to Computer Science II

79BGA

Comparing running time (3)

Both selection and insertion sort are By timing these algorithms on a real

computer system it can be shown that insertion sort is about twice as fast as selection sort. On a particular system we got the estimates

)( 2nO

sort insertion for sort selection for

,102.1)(,101.2)(

28

28

nnTnnT

Page 80: Intro to Computer Science II

80BGA

Class QuadraticSortTimer (1)

package chapter12.sorting;import java.util.Scanner;import java.util.Random;

public class QuadraticSortTimer{ public void doTest() { Scanner input = new Scanner(System.in); String sortType = "";

System.out.println("Selection sort: 1"); System.out.println("Insertion sort: 2"); System.out.println("Enter 1 or 2"); int choice = input.nextInt(); input.nextLine();

Page 81: Intro to Computer Science II

81BGA

Class QuadraticSortTimer (2)

System.out.print("Enter size if array: "); int size = input.nextInt(); input.nextLine(); System.out.print( "Enter number of trials to average: ");

int numTrials = input.nextInt(); input.nextLine(); Random rand = new Random(1234); int[] array = new int[size];

double timeSum = 0.0; for (int trial = 1; trial <= numTrials + 1; trial++) { for (int k = 0; k < array.length; k++) array[k] = rand.nextInt();

Page 82: Intro to Computer Science II

82BGA

Class QuadraticSortTimer (3)

long endTime = 0L, startTime = 0L; if (choice == 1) { sortType = "Selection type"; startTime = System.nanoTime(); // nano seconds IntArraySort.selectionSort(array, 0, array.length - 1); endTime = System.nanoTime(); } else { sortType = "Insertion type"; startTime = System.nanoTime(); // nano seconds IntArraySort.InsertionSort(array, 0, array.length - 1); endTime = System.nanoTime(); }

Page 83: Intro to Computer Science II

83BGA

Class QuadraticSortTimer (4)

// Skip first trial for the just in time compiler // and do numTrials trials

if (trial > 1) { // calculate seconds from nano seconds

double sortTime = (endTime - startTime) / 1E9; System.out.println("Sort time: " + sortTime + " seconds"); timeSum = timeSum + (double) sortTime } // end for loop

// compute time average over all trials

Page 84: Intro to Computer Science II

84BGA

Class QuadraticSortTimer (5)

// compute time average over all trials

double averageTime = timeSum / (double) numTrials;

System.out.println(); System.out.println(sortType); System.out.println("Array size (n): " + size); System.out.println("Number of trials: " + numTrials); System.out.println("Average running time: " + averageTime + " seconds"); double nSquared = (double) size * (double) size; double ratio = averageTime / nSquared; System.out.println("average / n^2: " + ratio); } // end of doTest method

Page 85: Intro to Computer Science II

85BGA

Class QuadraticSortTimer (6)

public static void main(String[] args) { QuadraticSortTimer timer = new QuadraticSortTimer(); timer.doTest(); }} // end of class QuadraticSortTimer

Page 86: Intro to Computer Science II

86BGA

Comparison results (2001)

88

88

88

88

88

88

88

22

1025.11013.2

1016.11015.2

1017.11017.2

1011.11016.2

1009.11012.2

1002.11007.2

1001.11064.1

/)(/)(

sec 125.0 sec 213.0 100,000

sec 29.0 sec 53.6 50,000

sec 18.8 sec 34.7 40,000

sec 10.0 sec 19.5 30,000

sec 4.36 sec 8.50 20,000

sec 1.02 sec 2.07 10,000

sec 0.25 sec 0.41 5,000

sort insertion sort selection size nnTnnTn

Page 87: Intro to Computer Science II

87BGA

Comparison results (2005)

hours) (38 sec 169,000 hours) (66 sec 237,000 10,000,000

hours) (12 sec 42,250 hours) sec(16 59,250 5,000,000

sec 1690 sec 2370 1,000,000

sec 16.92 sec 23.73 100,000

sec 4.244 sec 5.943 50,000

sec 2.706 sec 3.796 40,000

sec 1.524 sec 2.141 30,000

sec 0.679 sec 0.949 20,000

sec 0.172 sec 0.242 10,000

sec 0.044 sec 0.068 5,000

sort insertion sort selection size

99

99

99

99

99

99

99

22

1069.11037.2

1070.11038.2

1069.11037.2

1069.11038.2

1070.11037.2

1072.11040.2

1076.11040.2

/)(/)(

nnTnnTn

Page 88: Intro to Computer Science II

88BGA

Mergesort (1)

A naturally recursive algorithm for sorting the subarray

by splitting it into two halves

where and applying mergesort to each half

endstart aa ,,

midstart aaL , endmid aaR ,,1

2/)( endstartmid

Page 89: Intro to Computer Science II

89BGA

Mergesort (2)

Then we use a function called merge that will merge the two sorted halves together.

For example, if L = <1, 8, 12, 15, 17> is the left half and R = <2, 9, 10, 19, 21, 23, 25> is the right half then L and R are separately sorted and merge is supposed to produce the sorted subarray <1,2,8,9,10,12,15,17,19,21,23,25>

Page 90: Intro to Computer Science II

90BGA

MergeSort (3)

public static void mergeSort(int[] a, int start, int end){ if (start == end) { return; // one element subarray already sorted } int mid = (start + end) / 2; mergeSort(a, start, mid); // sort left half mergeSort(a, mid+1, end); // sort right half merge(a, start, mid, end);}

Top level recursive algorithm

Page 91: Intro to Computer Science II

91BGA

8,1,6,4,10,5,3,2,22

8,1,6,4,10 5,3,2,22

8,1,6 4,10 5,3 2,22

8,1 6 4 10 5 3 2 22

8 1

1,8

1,6,84,10 3,5 2,22

1,4,6,8,102,3,5,22

1,2,3,4,5,6,8,10,22

Page 92: Intro to Computer Science II

92BGA

The merge problem

11010

1

,

,,

,,,,

,

,,

startendstartend

endstart

endsplitsplitstart

endstart

ttttt

aa

aaaa

endsplitstartsplit

aa

that such array

temporary a into subarray entire

thesort order, increasing in sorted each are

and subarrays the

that such with index an

by dpartitione subarray a Given

Page 93: Intro to Computer Science II

93BGA

Example

The array <1, 8, 12 ,15 ,17, 2, 9, 10, 19, 21, 23, 25>is not sorted but if we choose split = 4 then the subarrays L = <1, 8, 12 ,15 ,17> R = <2, 9, 10, 19, 21, 23, 25>are separately sorted in increasing order.

Entire array can be sorted by a pairing technique called merging

Page 94: Intro to Computer Science II

94BGA

1

2

8

9

10

12

15

17

19

21

23

25

1

8

12

15

17

2

9

10

19

21

23

25

12

4

5

9

10

11

12

3

6

7

8

Page 95: Intro to Computer Science II

95BGA

Merge algorithm

10

1

1

10

10

,,,,

,,

,,

,,,,

,,

,,,,,

startendendstart

endsplit

splitstart

endsplitsplitstart

startend

n

ttaa

t

aa

t

aa

t

aaaa

ttt

endsplitstartaa

WHILEEND

DOWHILE

WHILEEND

DOWHILE

WHILEEND

DOWHILE

ALGORITHM

to themCopy

in remain elements

to themCopy

in remain elements

array temp to

smallestcopy and elements of pairs Compare

exhausted is nor neither

)merge(

Page 96: Intro to Computer Science II

96BGA

Java method (1)

int n = end - start + 1; // number of elements int[] t = new int[n]; // temp storage int i = start; // index into left subarray int j = split + 1; // index into right subarray int k = 0; // index into temporary storage

Define indices into subarrays and temporary array

public static void merge(int[], int start, int split, int end){

Page 97: Intro to Computer Science II

97BGA

Java method (2)

while (i <= split && j <= end) { if (a[i] < a[j]) // left element is smaller { t[k] = a[i]; // move it to temp array i++; // index next left element } else // right elment is smaller { t[k] = a[j]; // move it to temp array j++; // index next right element } k++; // in any case index next temp position }

merge elements from left and right subarrays to temp arrayuntil one or both of the subarrays are exhausted

Page 98: Intro to Computer Science II

98BGA

Java method (3)

while (i <= split) { t[k] = a[i]; i++; k++; }

Copy any remaining elements from the left subarray to the temporary array t

Page 99: Intro to Computer Science II

99BGA

Java method (4)

while (j <= end) { t[k] = a[j]; j++; k++; }

Copy any remaining elements from the right subarray to the temporary array t

Page 100: Intro to Computer Science II

100BGA

Java method (4)

for (k = 0; k < n; k++) { a[start + k] = t[k]; }} // end method

Copy all elements from the temporary array t to the array a.For increased efficiency we can also use System.arraycopy(t, 0, a, start, end-start+1)

Page 101: Intro to Computer Science II

101BGA

Compact version of loops

while (i <= split && j <= end) if (a[i] < a[j]) t[k++] = a[i++]; else t[k++] = a[j++];while (i <= split) t[k++] = a[i++];while (j <= end) t[k++] = a[j++];for (k = 0; k < n; k++) a[start + k] = t[k];

Here is a compact version of the loops

Here t[k++] means first use k as an index, then increment k.Therefore a statement such as t[k++] = a[i++] is equivalentto three assignment statements,t[k] = a[i]; k = k + 1; i = i + 1;

Page 102: Intro to Computer Science II

102BGA

Class IntArraySort

public class IntArraySort{ public static void selectionSort(int[] a, int start, int end) {...} public static void insertionSort(int[] a, int start, int end) {...} public static void mergeSort(int[] a, int start, int end) {...} public static void merge(int[] a, int start, int split, int end) {...}}

Put the merge and mergeSort methods in the IntArraySortclass as we did for the other sorting algorithms

MergeSort is tested in class SortTester

Page 103: Intro to Computer Science II

103BGA

Mergesort running time (1)

Let T(n) be the running time for array size n

The top level mergesort algorithm shows that T(n) = T(n / 2) + T(n / 2) + time for merge

The merge algorithm is O(n) so lets assume that its running time is an+b. Therefore

T(n) = 2T(n / 2) + an + b

Page 104: Intro to Computer Science II

104BGA

Mergesort running time (2)

For simplicity we assume thatfor some m

Results hold for any n but proof is a little more complicated.

Now use the recurrence relation to express in terms of

Then express in terms of and so on ...

mn 2

)2/( 2nT

)2/( 2nT )2/( 3nT)2/(nT

Page 105: Intro to Computer Science II

105BGA

Mergesort running time (3)

)log(

)log(

)1(log

)12()2/(2

)221()2/(2

...

)221(3)2/(2

)21(22/)2/(22

)21(2)2/(22

)2/(22

)2/(2)(

2

2

1

233

232

22

2

nnO

nnO

bnnann

banmnT

banmnT

bannT

banbannT

bannT

banbn

anT

bannTnT

mmm

mmm

mnT 21)1( and

Page 106: Intro to Computer Science II

106BGA

Running time comparison

18109

1698

1487

1276

1065

854

633

42

2

222

101099.2109.29

101066.2106.26

101033.2103.23

101099.1109.19

101066.1106.16

101033.1103.13

101097.91097.9

106641064.6

102.331032.3

loglog

nnnnn

Page 107: Intro to Computer Science II

107BGA

A disadvantage

Mergesort is thousands to millions of times faster than either selection sort or insertion sort

It's only disadvantage is the extra storage space required for the temporary array

Page 108: Intro to Computer Science II

108BGA

The file merge problem (1)

The merge algorithm that is part of mergesort is useful by itself for sorting files of data

PROBLEM: Given two files of records that are each sorted on some field in a specified order, produce a new file that contains all the records of both files in sorted order.

Example: merge two files of bank accounts sorted in order of increasing account number

Page 109: Intro to Computer Science II

109BGA

accounts1.dat (sorted)

175:Linda Kerr:8008.43424:Mary Binch:35135.5932:Harry Garfield:4723.11134:Alfred Vaillancourt:51914.931345:Amy Flintstone:81507.312489:Barney Lafreniere:66568.57123:Jean Ebert:53361.257845:Marc Gardiner:7541.329243:Dan Sinclair:4151.349546:Peter Jensen:16146.29

Page 110: Intro to Computer Science II

110BGA

accounts2.dat (sorted)

310:Don Laing:12337.39

417:Marc Tyler:3455.42

811:Amanda Schryer:3541.15

1219:Gilles Olivier:84285.23

1765:Patricia Innes:4494.43

9623:Remi Martin:19732.12

9754:Patricia Schneider:40066.76

9912:Mike Laforge:5798.0

Page 111: Intro to Computer Science II

111BGA

merge.dat (sorted)

175:Linda Kerr:8008.43

310:Don Laing:12337.39

417:Marc Tyler:3455.42

....

7123:Jean Ebert:53361.25

7845:Marc Gardiner:7541.32

9243:Dan Sinclair:4151.34

9546:Peter Jensen:16146.29

9623:Remi Martin:19732.12

9754:Patricia Schneider:40066.76

9912:Mike Laforge:5798.0

Page 112: Intro to Computer Science II

112BGA

class FileMerger (1)

public class FileMerger{ private File inFile1; private File inFile2; private File outFile;

public FileMerger(File inFile1, File inFile2, File outFile) { this.inFile1 = inFile1; this.inFile2 = inFile2; this.outFile = outFile; }

Read two input bank account files that are sorted and mergethem to produce a sorted output file

Page 113: Intro to Computer Science II

113BGA

class FileMerger (2)

public void mergeFiles() throws IOException { BufferedAccountReader in1 = new BufferedAccountReader( new FileReader(inFile1)); BufferedAccountReader in2 = new BufferedAccountReader( new FileReader(inFile2));

PrintAccountWriter out = new PrintAccountWriter( new FileWriter(outFile));

Merge the two input files according to increasing accountnumber into a single sorted file. We can use ourBufferedAccountReader and PrintAccountWriter classes

Page 114: Intro to Computer Science II

114BGA

class FileMerger (3)

BankAccount b1 = in1.readAccount(); BankAccount b2 = in2.readAccount(); while (b1 != null && b2 != null) { if (b1.getNumber() < b2.getNumber()) { out.writeAccount(b1); b1 = in1.readAccount(); } else { out.writeAccount(b2); b2 = in2.readAccount(); } }

Read accounts until end of file is reached on one or both files

Page 115: Intro to Computer Science II

115BGA

class FileMerger (4)

while (b1 != null) { out.writeAccount(b1); b1 = in1.readAccount(); }

while (b2 != null) { out.writeAccount(b2); b2 = in2.readAccount(); }

If there are accounts remaining in first file write them to theoutput file until we find end of file on first file. Then do thesame for second file.

Page 116: Intro to Computer Science II

116BGA

class FileMerger (5)

in1.close(); in2.close(); out.close(); } // end of fileMerge method

close all the files

Page 117: Intro to Computer Science II

117BGA

class FileMerger (6)

public static void main(String[] args) { if (args.length == 3) { File inFile1 = new File(args[0]); File inFile2 = new File(args[1]); File outFile = new File(args[2]); FileMerger merger = new FileMerger(inFile1, inFile2, outFile); merger.mergeFiles(); } else { System.out.println( "args: inFileName1 inFileName2 outFileName"); } }} // end of FileMerger class

main method to run the program

Page 118: Intro to Computer Science II

118BGA

Quicksort (1)

A very efficient sorting algorithm Uses the recursive divide and conquer

technique as in binary search and merge sort

Subarray is partitioned in two parts in such a way that neither part is necessarily sorted but such that each element in the left part is less or equal to every element in the right part

Page 119: Intro to Computer Science II

119BGA

Quicksort (2)

A partition of the subarray

defined by x has the form

where for each y in Land for each y in R

endstart aa ,

splitendsplitsplitstart axaaRaaL ,,, 1

splitay splitay

Page 120: Intro to Computer Science II

120BGA

Quicksort (3)

The division process into subarrays isO(log n)

The partitioning process is O(n) Then the average case behaviour of

quicksort is O(n log n) as in merge sort. Unlike mergesort, quicksort doesn't

need a temporary array but its worst case behaviour is )( 2nO

Page 121: Intro to Computer Science II

121BGA

Example (1)

Consider the array <8, 1, 10, 4, 6, 5, 3, 2, 22>

Choose middle element 6 as pivot element

Then an initial partition is defined by L = <2, 1, 6, 4, 5, 3>, R = <10, 8, 22>

Here every element in L is less or equal to 6 and every element in R is equal to or greater than 6 so this is a partition even though neither L nor R are sorted

Page 122: Intro to Computer Science II

122BGA

Example (2)

Consider the array <8, 1, 6, 4, 10, 5, 3, 2, 22>

Choose middle element 10 as pivot element

Then an initial partition is defined by L = <2, 1, 6, 4, 8, 5, 3, 10>, R = <22>

Here every element in L is less or equal to 10 and every element in R is equal or greater than 10 so this is a partition even though neither L nor R are sorted

Page 123: Intro to Computer Science II

123BGA

8,1,6,4,10,5,3,2,22

2,1,6,4,8,5,3,10 22

3,1,2,4 8,5,6,10

1 3,2,4 8,6,10

2 3,4 6 8,10

3 4 8 10

5

Page 124: Intro to Computer Science II

124BGA

QuickSort (4)

public static void quickSort(int[] a, int start, int end){ if (start < end) { int split = partition(a, start, end); quickSort(a, start, split-1); // sort left half quickSort(a, split+1, end); // sort right half }}

Top level recursive algorithm

The pivot is in its correct position so it is not included in thesubarrys for either of the recursive calls.

Page 125: Intro to Computer Science II

125BGA

Java partition method (1)

public static int partition(int[] a, int start, int end){

choose middle element as pivot and move it to thestart of the subarray temporarily

swap(a, (start + end) / 2, start); int pivot = a[start];

Page 126: Intro to Computer Science II

126BGA

Java partition method (2)

partition elements a[start + 1] to a[end]. lastLeft is index of the last element in the left subarray. The elements a[start] to a[lastIndex] are less than or equal to the pivot value. int lastLeft = start; for (int j = start+1; j <= end; j++) { if (a[j] < pivot) { lastLeft++; // nove partition index left swap(a, j, lastLeft); } } // Move pivot back to its correct position swap(a, start, lastLeft); return lastLeft;} // end of partition method

Page 127: Intro to Computer Science II

127BGA

Java partition method (3)

the swap method exchanges two elements of array a withindices i and j private static void swap(int[] a, int i, int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; }

Page 128: Intro to Computer Science II

128BGA

Class IntArraySort (1)

public class IntArraySort{ public static void selectionSort(int[] a, int start, int end) {...} public static void insertionSort(int[] a, int start, int end) {...} public static void mergeSort(int[] a, int start, int end) {...} public static void merge(int[] a, int start, int split, int end) {...}

Put the partition. swap, and quickSort elements in the IntArraySort class as we did for the other sorting algorithms

Page 129: Intro to Computer Science II

129BGA

Class IntArraySort (2)

public static int partition(int[] a, int start, int end) {...}

public static void quickSort(int[] a, int start, int end) {...}

private static void swap(int[] a, int start, int end) {...}

} // end of IntArraySort

QuickSort is tested in class SortTester

Page 130: Intro to Computer Science II

130BGA

Quicksort running time (1)

Average case behaviour is same as mergesort

Same recurrence relation is obtained. Disadvantage of quicksort: worst case

behaviour is This can be avoided by some tricks to

choose the pivot element.

)( 2nO

Page 131: Intro to Computer Science II

131BGA

Class FasterSortTimer

This class times mergesort and quicksort and is almostindentical to QuadraticSortTimer

Page 132: Intro to Computer Science II

132BGA

Merge/Quick sort (2001)

77

77

77

77

77

106.11.12101.57.36000,000,5

105.109.2101.501.7000,000,1

105.117.0107.565.0000,100

101.202.0106.707.0000,10

100.201.0100.803.05000

ln/)(ln/)(

sec sec

sec sec

sec sec

sec sec

sec sec

quicksortmerge size nnnTnnnTn

Page 133: Intro to Computer Science II

133BGA

Merge/Quick sort (2005)

8

88

88

88

8

8

1031.2783.3000,000,10

1031.2785.11091.4787.3000,000,5

1033.2322.01083.4667.0000,000,1

1026.2026.01052.4052.0000,100

000.01051.6006.0000,10

000.01039.9004.05000

ln/)(ln/)(

sec

sec sec

sec sec

sec sec

sec sec

sec sec

quicksortmerge size nnnTnnnTn

Page 134: Intro to Computer Science II

134BGA

SortTester (1)

package chapter12.sorting;import java.util.Scanner;

public class SortTester{ public void doTest() { Scanner input = new Scanner(System.in);

System.out.print( "Enter number of integers in array: "); int size = input.nextInt(); input.nextLine();

Testing all the sorting algorithms in one class

Page 135: Intro to Computer Science II

135BGA

SortTester (2)

int[] testArray = new int[size]; for (int k = 0; k < testArray.length; k++) { System.out.print{"Enter element " + k + ": "); testArray[k] = input.nextInt(); input.nextLine(); } System.out.print( "Enter start index for subarray: "); int start = input.nextInt(); input.nextLine(); System.out.print( "Enter end index for subarray: "); int end = input.nextInt(); input.nextLine();

Page 136: Intro to Computer Science II

136BGA

SortTester (3)

int[] testArrayCopy;

testArrayCopy = arrayCopy(testArray); IntArraySort.selectionSort(testArrayCopy, start, end); System.out.println( "Selection sort: Sorted subarray is"); printArray(testArrayCopy, start, end);

testArrayCopy = arrayCopy(testArray); IntArraySort.insertionSort(testArrayCopy, start, end); System.out.println( "Insertion sort: Sorted subarray is"); printArray(testArrayCopy, start, end);

Page 137: Intro to Computer Science II

137BGA

SortTester (4)

testArrayCopy = arrayCopy(testArray); IntArraySort.selectionSort(testArrayCopy, start, end); System.out.println( "Selection sort: Sorted subarray is"); printArray(testArrayCopy, start, end);

testArrayCopy = arrayCopy(testArray); IntArraySort.mergeSortSort(testArrayCopy, start, end); System.out.println( "Merge sort: Sorted subarray is"); printArray(testArrayCopy, start, end);

Page 138: Intro to Computer Science II

138BGA

SortTester (5)

testArrayCopy = arrayCopy(testArray); IntArraySort.quickSort(testArrayCopy, start, end); System.out.println( "Quick sort: Sorted subarray is"); printArray(testArrayCopy, start, end); } // end of doTest method

Page 139: Intro to Computer Science II

139BGA

SortTester (6)

private void printArray(int[] a, int start,int end) { System.out.print("["); for (int k = start; k <= end; k++) { System.out.print(a[k]); if (k < end) System.out.print(","); } System.out.println("]"); System.out.println(); }

Page 140: Intro to Computer Science II

140BGA

SortTester (7)

private void printArray(int[] a, int start,int end) { System.out.print("["); for (int k = start; k <= end; k++) { System.out.print(a[k]); if (k < end) System.out.print(","); } System.out.println("]"); System.out.println(); }

Page 141: Intro to Computer Science II

141BGA

SortTester (8)

private int[] arrayCopy(int[] a) { int[] copy = new int[a.length]; for (int k = 0; k < a.length; k++) { copy[k] = a[k]; } return copy; }

public static void main(String[] args) { new SortTester().doTest(); }

Could also useSystem.arraycopy

Page 142: Intro to Computer Science II

142BGA

Generic object sorting

Our sorting algorithms so far will only work with arrays of type int[]

What do we do if we want to sort other kinds of arrays such as arrays of BankAccount objects?

Also we may want to sort in a different order: for example, decreasing instead of increasing.

Page 143: Intro to Computer Science II

143BGA

Generic arrays

We can write our sorting methods using a generic object type parameter instead of a specific type such as int

We can use a generic parametric type E and an array whose elements are of type E using E[]

Page 144: Intro to Computer Science II

144BGA

Generic comparison

if (a[j] < a[k]) k = j;

We need a way to compare two objects of type E

For example in our selectionSort method for int[] arrayswe have the statement

This will not work if we want a method to sort an array ofstrings. Then we would need to use the statementif (a[j].compareTo(a[k]) < 0) k = j

Page 145: Intro to Computer Science II

145BGA

Comparator<E> interface

public int compare(E obj1, E obj2);

The solution is to use the Comparator<E> interface for comparing objects of type E. To implement this interface we need to provide an implementation of the following method

Here a negative value is returned if obj1 "is less than" obj2, the value 0 if obj1 "is equal to" obj2 and a positive value if obj1 "is greater than" obj2

Page 146: Intro to Computer Science II

146BGA

Using Comparator<E>

public static <E> void selectionSort(E[] a, int start, int end, Comparator<E> f){...}

We can now make a generic version of selection sort:

Change the prototype to

Here we have added a Comparator<E> argument so for comparison we can use

if (f.compare(a[j],a[k]) < 0) k = j

Here f is an object from any class that implements the Comparator interface.

Needed for static methods

Page 147: Intro to Computer Science II

147BGA

Generic types

A generic type can be any object type

NOTE: A primitive type such as int or double cannot be a generic type: only object types can be generic

If you want to sort an array of type int[] using a method of generic type it is necessary to use the wrapper class Integer to do it. Similarly for double type use the wrapper class Double.

Autoboxing and unboxing simplify this

Page 148: Intro to Computer Science II

148BGA

Generic selection sort

public static <E> void selectionSort(E[] a, int start, int end, Comparator<E> f){ for (int i = start; i < end; i++) { int k = i; for (int j = i+1; j <= end; j++) { if (f.compare(a[j[,a[k]) < 0) k = j; }

E temp = a[k]; a[k] = a[i]; a[i] = temp;}

Note the generic type here

Page 149: Intro to Computer Science II

149BGA

Generic insertion sort

public static <E> void selectionSort(E[] a, int start, int end, Comparator<E> f){ for (int i = start + 1; i < end; i++) { E x = a[i]; int j = i-1; while ( (j >= start) && (f.compare(x,a[j]) < 0)) { a[j+1] = a[j]; j--; } a[j+1] = x; }}

Page 150: Intro to Computer Science II

150BGA

GenericArraySort Class

Put the generic sorting methods in a class called GenericArraySort

public class GenericArraySort{ public static <E> selectionSort(E[] a, int start, int end, Comparator<E> f) {...} public static <E> insertionSort(E[] a, int start, int end, Comparator<E> f) {...}

// merge and quick sort go here

Page 151: Intro to Computer Science II

151BGA

Sorting an array of strings (1)

public class StringComparator implements Comparator<String>{ public int compare(String s1, String s2) { return s1.compareTo(s2); }}

To sort an array of strings in lexicographical order first define the following class which uses the compareTo method in the String class to implement the compare method of the Comparator interface

The type E is String now

Page 152: Intro to Computer Science II

152BGA

Sorting an array of strings (2)

public class StringDecreasingComparator implements Comparator<String>{ public int compare(String s1, String s2) { return s2.compareTo(s1); }}

To sort an array of strings in reverse lexicographical order first define the following class which uses the compareTo method in the String class to implement the compare method of the Comparator interface

The type E is String now

Page 153: Intro to Computer Science II

153BGA

Sorting an array of strings (3)

String[] s = {"one", "two", "three", "four" };GenericArraySort.selectionSort(s, 0, s.length – 1, new StringComparator());

The following statements can be used to sort an array of strings in lexicograpical order

To sort in reverse lexicograpical order use

String[] s = {"one", "two", "three", "four" };GenericArraySort.selectionSort(s, 0, s.length – 1, new StringDecreasingComparator());

Page 154: Intro to Computer Science II

154BGA

Sorting array of accounts (1)

public class AccountNumberComparator implements Comparator<BankAccount>{ public int compare(BankAccount b1, BankAccount b2) { return b1.getNumber() – b2.getNumber(); }}

To sort an array of BankAccount objects in order of increasing account number define the following class

Page 155: Intro to Computer Science II

155BGA

Sorting array of accounts (2)

public class AccountBalanceComparator implements Comparator<BankAccount>{ public int compare(BankAccount b1, BankAccount b2) { return b1.getBalance() – b2.getBalance(); }}

To sort an array of BankAccount objects in order of increasing balance define the following class

Page 156: Intro to Computer Science II

156BGA

Comparable interface

public int compareTo(E element)

A class can also implement the Comparable<E> interface.The String class and many other classes implement this interface.

To implement this interface a class must provide an implementation of the following method

The Comparator<E> interface is more general since it can be used to provide several different orderings of the objects of a class.

Page 157: Intro to Computer Science II

157BGA

The Arrays class

Java provides an Arrays class that contains searching and sorting methods for arrays. To use these methods the array elements must be from a class that implements the Comparable<E> interface

There are also versions of these methods that uses the Comparator<E> interface

See textbook for more on these methods and some examples