Liang, Introduction to Java Programming 1
Arrays
Gang Qian
Department of Computer ScienceUniversity of Central Oklahoma
2
Objectives
Using arrays: declaring array reference variables and creating arrays
Initializing the values in an array Copying contents from one array to another Methods with array arguments and return
type Search Algorithms: Linear and Binary search Selection Sort Algorithm Multidimensional arrays
3
Introducing Arrays
A variable or a constant correspond to a single value
Motivation question: The user will enter several integers and then
display each of them in ascending order. If we do not know how many integers will be entered before hand, we cannot solve the problem
An array is a data structure that represents a sequence of the same types of data
4
Declaring Array Variables
Syntax: datatype[] arrayRefVar;
Example: double[] myList;
Alternative syntax: datatype arrayRefVar[]; // This style is allowed, but not preferred
Example: double myList[];
5
Creating Arrays
Syntax: arrayRefVar = new datatype[arraySize]; Example:myList = new double[10]; myList[0] references the first element in the
array. myList[9] references the last element in the array.
6
Declaring and Creating in One Step Syntax: datatype[] arrayRefVar = new datatype[arraySize];
Example: double[] myList = new double[10];
Alternative Syntax:
datatype arrayRefVar[] = new datatype[arraySize];
Example: double myList[] = new double[10];
7
5.6
4.5
3.3
13.2
4
34.33
34
45.45
99.993
11123
double[] myList = new double[10];
myList reference myList[0]
myList[1]
myList[2]
myList[3]
myList[4]
myList[5]
myList[6]
myList[7]
myList[8]
myList[9]
Element value
Array reference variable
Array element at index 5
8
The Length of an Array
Once an array is created, its size is fixed Array size cannot be changed
We can find its size using the following syntax: arrayRefVar.length Note that length is a constant, not a method
There is no parentheses following length
For example, myList.length returns 10
9
Default Values
When an array is created, its elements are assigned the default values 0 for the numeric data types
'\u0000' for char types false for boolean types
Caution: This is only true in Java In many other programming languages, a array
must be explicitly initialized after being created E.g., C, C++, Pascal, etc.
10
Indexed Variables
The array elements are accessed through the index
The array indices are 0-based It starts from 0 to arrayRefVar.length-1 In the previous figure, myList holds ten double
values and the indices are from 0 to 9 Each element in the array is represented
using the following syntax, known as an indexed variable:arrayRefVar[index]
11
Using Indexed Variables
After an array is created, an indexed variable can be used in the same way as a regular variable
For example, the following code adds the value in myList[0] and myList[1] to myList[2]:myList[2] = myList[0] + myList[1];
12
Array Initializers
Java has a shorthand notation to declare, create, and initialize an array in one statement:double[] myList = {1.9, 2.9, 3.4, 3.5};
This shorthand notation is equivalent to the following statements:double[] myList = new double[4];
myList[0] = 1.9;
myList[1] = 2.9;
myList[2] = 3.4;
myList[3] = 3.5;
13
CAUTION
This shorthand syntax must be in one statement
The following is incorrect:double[] myList = new double[4];
myList= {1.9, 2.9, 3.4, 3.5};
14
Trace Program with Arrays
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
Declare array variable values, create an array, and assign its reference to values
After the array is created
0
1
2
3
4
0
0
0
0
0
15
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
i becomes 1
After the array is created
0
1
2
3
4
0
0
0
0
0
16
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
i (=1) is less than 5
After the array is created
0
1
2
3
4
0
0
0
0
0
17
In the first iteration
0
1
2
3
4
0
1
0
0
0
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
After this line is executed, value[1] is 1
18
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
After i++, i becomes 2
In the first iteration
0
1
2
3
4
0
1
0
0
0
19
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
i (= 2) is less than 5
In the first iteration
0
1
2
3
4
0
1
0
0
0
20
In the second iteration
0
1
2
3
4
0
1
3
0
0
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
After this line is executed, values[2] is 3 (2 + 1)
21
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
After this, i becomes 3
In the second iteration
0
1
2
3
4
0
1
3
0
0
22
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
i (=3) is still less than 5.
In the second iteration
0
1
2
3
4
0
1
3
0
0
23
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
After this line, values[3] becomes 6 (3 + 3)
In the third iteration
0
1
2
3
4
0
1
3
6
0
24
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
After this, i becomes 4
In the third iteration
0
1
2
3
4
0
1
3
6
0
25
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
i (=4) is still less than 5
In the third iteration
0
1
2
3
4
0
1
3
6
0
26
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
After this, values[4] becomes 10 (4 + 6)
In the fourth iteration
0
1
2
3
4
0
1
3
6
10
27
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
After i++, i becomes 5
In the fourth iteration
0
1
2
3
4
0
1
3
6
10
28
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
i ( =5) < 5 is false. Exit the loop
In the fourth iteration
0
1
2
3
4
0
1
3
6
10
29
0
1
2
3
4
11
1
3
6
10
public class Test { public static void main(String[] args) { int[] values = new int[5]; for (int i = 1; i < 5; i++) { values[i] = i + values[i-1]; } values[0] = values[1] + values[4]; }}
After this line, values[0] is 11 (1 + 10)
30
Examples of Arrays Processing Initializing an array with random values
between 0.0 and 99.0double[] myList = new double[4];
for (int i = 0; i < myList.length; i++) {
myList[i] = Math.random() * 100;
}
Printing an arrayfor (int i = 0; i < myList.length; i++) {
System.out.print(myList[i] + " ");
}
31
Summing all elementsdouble total = 0;
for (int i = 0; i < myList.length; i++) {
total += myList[i];
}
Finding the largest elementdouble max = myList[0];
for (int i = 1; i < myList.length; i++) {
if (myList[i] > max)
max = myList[i];
}
32
Finding the smallest index of the largest elementdouble max = myList[0];
int indexOfMax = 0;
for (int i = 1; i < myList.length; i++) {
if (myList[i] > max) {
max = myList[i];
indexOfMax = i;
}
}
33
Example: Testing Arrays (TestArray.java) Objective: The program receives 6 numbers from
the user, finds the largest number and counts the occurrence of the largest number entered Suppose you entered 3, 5, 2, 5, 5, and 5, the largest
number is 5 and its occurrence count is 4
34
See Arrays in NetBeans Debugger You can trace the value of array elements in the debugger
using the Interactions pane
35
Example: Assigning Grades (AssignGrade.java) Objective: read student scores (int), get the
best score, and then assign grades based on the following scheme: Grade is A if score is >= best–10; Grade is B if score is >= best–20; Grade is C if score is >= best–30; Grade is D if score is >= best–40; Grade is F otherwise
36
Copying Arrays (The Wrong Way) Often, in a program, you need to duplicate an array or a part of
an array. In such cases you could attempt to use the assignment statement (=), as follows: list2 = list1;
Contents of list1
list1
Contents of list2
list2
Before the assignment list2 = list1;
Contents of list1
list1
Contents of list2
list2
After the assignment list2 = list1;
Garbage
37
Copying Arrays (The Correct Way) Using a loop:
int[] sourceArray = {2, 3, 1, 5, 10};
int[] targetArray = new int[sourceArray.length];
for (int i = 0; i < sourceArrays.length; i++)
targetArray[i] = sourceArray[i];
38
Passing Arrays to Methods
Defining a method that takes an int array as a formal parameterpublic static void printArray(int[] array) { for (int i = 0; i < array.length; i++) { System.out.print(array[i] + " "); }}
Invoking the method with an int array as an argument (actual parameter)int[] list = {3, 1, 2, 6, 4, 2};printArray(list);
39
Pass By Value Revisited
Java always uses pass by value to pass parameters to a method However, there are important differences between passing a
value of variables of primitive data types and passing arrays For a parameter of a primitive type value, the actual value is
passed Changing the value of the formal parameter inside the method
does not affect the value of the actual parameter outside the method
For a parameter of an array type, the value of the parameter contains a reference to an array; this reference is passed to the method Any changes to the array that occur inside the method body will
affect the original array that was passed as the argument
40
Simple Example
public class Test { public static void main(String[] args) { int x = 1; // an int value int[] y = new int[10]; // an array of int values m(x, y); // Invoke m with arguments x and y System.out.println("x is " + x); System.out.println("y[0] is " + y[0]); } public static void m(int number, int[] numbers) { number = 1001; // A new value to number numbers[0] = 5555; // A new value to numbers[0] }}
41
Call Stack
Space required for the main method int[] y: int x: 1
Stack Space required for method m int[] numbers: int number: 1
reference
Array of ten int values is stored here
The arrays are stored in a heap.
Heap
reference
When invoking m(x, y), the values of x and y are passed to number and numbers. Since y contains the reference value to the array, numbers now contains the same reference value to the same array
42
Heap
The JVM stores the array in an area of memory, called heap, which is used for dynamic memory allocation where blocks of memory are allocated and freed in an arbitrary order
Space required for the main method int[] y: int x: 1
Stack Space required for method m int[] numbers: int number: 1
reference
Array of ten int values is stored here
The arrays are stored in a heap.
Heap
reference
43
Example: Passing Arrays as Arguments (TestPassArray.java) Objective: Demonstrate differences of
passing primitive data type variables and array variables
44
Invoke swap(int n1, int n2). The primitive type values in a[0] and a[1] are passed to the swap method.
Space required for the main method int[] a
Stack Space required for the swap method
n2: 2 n1: 1
reference a[1]: 2 a[0]: 1
The arrays are stored in a heap.
Invoke swapFirstTwoInArray(int[] array). The reference value in a is passed to the swapFirstTwoInArray method.
Heap
Space required for the main method int[] a
Stack Space required for the swapFirstTwoInArray method int[] array
reference
reference
45
Returning an Array from a Method Define the method that returns an arraypublic static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;} Call the methodint[] list1 = {1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
46
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
Trace the reverse Method
list
result
1 2 3 4 5 6
0 0 0 0 0 0
Declare result and create array
47
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 0 0 0 0 0
i = 0 and j = 5
48
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 0 0 0 0 0
i (= 0) is less than 6
49
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 0 0 0 0 1
i = 0 and j = 5 Assign list[0] to result[5]
50
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 0 0 0 0 1
After this, i becomes 1 and j becomes 4
51
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 0 0 0 0 1
i (=1) is less than 6
52
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 0 0 0 2 1
i = 1 and j = 4 Assign list[1] to result[4]
53
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 0 0 0 2 1
After this, i becomes 2 and j becomes 3
54
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 0 0 0 2 1
i (=2) is still less than 6
55
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 0 0 3 2 1
i = 2 and j = 3 Assign list[i] to
result[j]
56
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 0 0 3 2 1
After this, i becomes 3 and j becomes 2
57
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 0 0 3 2 1
i (=3) is still less than 6
58
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 0 4 3 2 1
i = 3 and j = 2 Assign list[i] to
result[j]
59
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 0 4 3 2 1
After this, i becomes 4 and j becomes 1
60
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 0 4 3 2 1
i (=4) is still less than 6
61
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 5 4 3 2 1
i = 4 and j = 1 Assign list[i] to
result[j]
62
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 5 4 3 2 1
After this, i becomes 5 and j becomes 0
63
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
0 5 4 3 2 1
i (=5) is still less than 6
64
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
6 5 4 3 2 1
i = 5 and j = 0 Assign list[i] to
result[j]
65
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
6 5 4 3 2 1
After this, i becomes 6 and j becomes -1
66
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
6 5 4 3 2 1
i (=6) < 6 is false. So exit the loop
67
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};int[] list2 = reverse(list1);
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result;}
list
result
1 2 3 4 5 6
6 5 4 3 2 1
Return result
list2
68
Example: Counting Occurrence of Each Letter (CountLettersInArray.java) Generate 100 lowercase letters randomly and assign to an array of
characters. Count the occurrence of each letter in the array
Space required for the main method
char[] chars: ref
(a) Executing createArray in Line 6
Space required for the main method
char[] chars: ref
Heap
Array of 100 characters
Space required for the createArray method
char[] chars: ref
(b) After exiting createArray in Line 6
Heap
Array of 100 characters
Stack Stack
69
Searching Arrays
Searching is the process of looking for a specific element in an array For example, discovering whether a certain score is
included in a list of scores Searching is a common task in computer
programming There are many algorithms and data structures
devoted to searching We will discuss two commonly used approaches
Linear search Binary search
70
Linear Search
The linear search approach compares the key element, key, sequentially with each element in the array list
The method continues to do so until the key matches an element in the list or the list is exhausted without a match being found If a match is made, the linear search returns the
index of the element in the array that matches the key
If no match is found, the search returns -1
71
Example: LinearSearch.java
public class LinearSearch { /** The method for finding a key in the list */ public static int linearSearch(int[] list, int key) { for (int i = 0; i < list.length; i++) if (key == list[i]) return i; return -1; } }
list
key Compare key with list[i] for i = 0, 1, …
[0] [1] [2] …
72
Linear Search Animation
6 4 1 9 7 3 2 8
6 4 1 9 7 3 2 8
6 4 1 9 7 3 2 8
6 4 1 9 7 3 2 8
6 4 1 9 7 3 2 8
6 4 1 9 7 3 2 8
3
3
3
3
3
3
Key List
73
/** The method for finding a key in the list */public static int linearSearch(int[] list, int key) { for (int i = 0; i < list.length; i++) if (key == list[i]) return i; return -1;}
See some results
int[] list = {1, 4, 4, 2, 5, -3, 6, 2};int i = linearSearch(list, 4); // returns 1int j = linearSearch(list, -4); // returns -1int k = linearSearch(list, -3); // returns 5
More Illustration
74
Binary Search
For binary search to work, the elements in the array must already be ordered
Without loss of generality, we usually assume that the array is in ascending order E.g., 2 4 7 10 11 45 50 59 60 66 69 70 79
The binary search first compares the key with the element in the middle of the array
75
Consider the following three cases: If the key is less than the middle element, you
only need to search the key in the first half of the array
If the key is equal to the middle element, the search ends with a match
If the key is greater than the middle element, you only need to search the key in the second half of the array
76
Binary Search Animation
1 2 3 4 6 7 8 9
1 2 3 4 6 7 8 9
1 2 3 4 6 7 8 9
8
8
8
Key List
77
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12]
2 4 7 10 11 45 50 59 60 66 69 70 79
key is 11
key < 50
list
mid
[0] [1] [2] [3] [4] [5] key > 7
key == 11
high low
mid high low
list
[3] [4] [5]
mid high low
list
2 4 7 10 11 45
10 11 45
78
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12]
2 4 7 10 11 45 50 59 60 66 69 70 79
key is 54
key > 50
list
mid
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] key < 66
key < 59
high low
mid high low
list
[7] [8]
mid high low
list
59 60 66 69 70 79
59 60
[6] [7] [8]
high low
59 60
79
Binary Search Program (BinarySearch.java) The binarySearch method returns the
index of the search key if it is contained in the list. Otherwise, it returns –insertion point – 1 The insertion point is the point at which the key
would be inserted into the list
80
The Arrays.binarySearch API Method Due to its efficiency, binary search is frequently
used Java provides several overloaded API binarySearch methods for searching a key in an array of int, double, char, short, long, and float in the java.util.Arrays class
Example 1:int[] list = {2, 4, 7, 10, 11, 45, 50, 59, 60, 66,
69, 70, 79};
System.out.println("Index is " + java.util.Arrays.binarySearch(list, 11));
Returns 4
81
Example 2:char[] chars = {'a', 'c', 'g', 'x', 'y', 'z'};
System.out.println("Index is " + java.util.Arrays.binarySearch(chars, 't'));
For the binarySearch method to work, the array must be pre-sorted in increasing order
Returns –4(insertion point is 3, so the return is -3-1)
82
Sorting Arrays
Sorting, like searching, is also a common task in computer programming It would be used, for instance, if you wanted to
display the grades from the “Assigning Grades” example in alphabetical order
Many different algorithms have been developed for sorting
We introduce a simple, intuitive sorting algorithm in this lecture: Selection Sort
83
Selection Sort
Selection sort finds the largest number in the list and places it last
It then finds the largest number remaining and places it next to last, and so on until the list contains only a single number
The following figure shows how to sort the list {2, 9, 5, 4, 8, 1, 6} using selection sort
84
2 9 5 4 8 1 6
swap
Select 9 (the largest) and swap it with 6 (the last) in the list
2 6 5 4 8 1 9
swap
The number 9 now is in the correct position and thus no longer need to be considered.
2 6 5 4 1 8 9
swap
2 1 5 4 6 8 9
Select 8 (the largest) and swap it with 1 (the last) in the remaining list
The number 8 now is in the correct position and thus no longer need to be considered.
Select 6 (the largest) and swap it with 1 (the last) in the remaining list
The number 6 now is in the correct position and thus no longer need to be considered.
(Continued on next slide)
85
2 1 5 4 6 8 9
swap
The number 6 now is in the correct position and thus no longer need to be considered.
2 1 4 5 6 8 9
4 is the largest and last in the list. No swap is necessary
2 1 4 5 6 8 9
swap
The number 4 now is in the correct position and thus no longer need to be considered.
1 2 4 5 6 8 9
Select 2 (the largest) and swap it with 1 (the last) in the remaining list
The number 2 now is in the correct position and thus no longer need to be considered.
Since there is only one number in the remaining list, sort is completed
Select 5 (the largest) and swap it with 4 (the last) in the remaining list
The number 5 now is in the correct position and thus no longer need to be considered.
86
Selection Sort Animation
2 9 5 4 8 1 6
2 6 5 4 8 1 9
2 6 5 4 1 8 9
2 1 4 5 6 8 9
2 1 4 5 6 8 9
2 1 5 4 6 8 9
1 2 4 5 6 8 9
int[] myList = {2, 9, 5, 4, 8, 1, 6}; // Unsorted
87
From Idea to Solution
for (int i = list.length - 1; i >= 1; i--) { select the largest element in list[0..i]; swap the largest with list[i], if necessary; // list[i] is in place // The next iteration applies on list[0..i-1]}
list[0] list[1] list[2] list[3] ... list[10]
list[0] list[1] list[2] list[3] ... list[9]
list[0] list[1] list[2] list[3] ... list[8]
list[0] list[1] list[2] list[3] ... list[7]
list[0]
...
88
for (int i = list.length - 1; i >= 1; i--) { select the largest element in list[0..i]; swap the largest with list[i], if necessary; // list[i] is in place // The next iteration applies on list[0..i-1]}
Expand // Find the maximum in the list[0..i] double currentMax = list[0]; int currentMaxIndex = 0; for (int j = 1; j <= i; j++) { if (currentMax < list[j]) { currentMax = list[j]; currentMaxIndex = j; } }
89
// Swap list[i] with list[currentMaxIndex] if necessary;if (currentMaxIndex != i) { list[currentMaxIndex] = list[i]; list[i] = currentMax;}
for (int i = list.length - 1; i >= 1; i--) { select the largest element in list[0..i]; swap the largest with list[i], if necessary; // list[i] is in place // The next iteration applies on list[0..i-1]}
Expand
90
/** The method for sorting the numbers */public static void selectionSort(double[] list) { for (int i = list.length - 1; i >= 1; i--) { // Find the maximum in the list[0..i] double currentMax = list[0]; int currentMaxIndex = 0; for (int j = 1; j <= i; j++) { if (currentMax < list[j]) { currentMax = list[j]; currentMaxIndex = j; } } // Swap list[i] with list[currentMaxIndex] if
necessary; if (currentMaxIndex != i) { list[currentMaxIndex] = list[i]; list[i] = currentMax; } }}
Invoke it:selectionSort(yourList)
91
Selection Sort Code
Selection Sort source code SelectionSort.java
92
The Arrays.sort Method
Java provides several overloaded API sort methods for sorting an array of int, double, char, short, long, and float in the java.util.Arrays class
For example, the following code sorts an array of numbers and an array of charactersdouble[] numbers = {6.0, 4.4, 1.9, 2.9, 3.4, 3.5};
java.util.Arrays.sort(numbers);
char[] chars = {'a', 'A', '4', 'F', 'D', 'P'};
java.util.Arrays.sort(chars);
93
Two-dimensional Arrays
Syntax:// Declare array refVardataType[][] refVar;
// Create array and assign its reference to variablerefVar = new dataType[10][10];
// Combine declaration and creation in one statementdataType[][] refVar = new dataType[10][10];
// Alternative syntaxdataType refVar[][] = new dataType[10][10];
94
Example: Declaring Variables of Two-dimensional Arrays and Creating Two-dimensional Arrays int[][] matrix = new int[10][10]; orint matrix[][] = new int[10][10];
matrix[0][0] = 3;
for (int i = 0; i < matrix.length; i++) for (int j = 0; j < matrix[i].length; j++) matrix[i][j] = (int)(Math.random() * 1000);
double[][] x;
95
Two-dimensional Array Illustration
7
0 1 2
0 1 2
int[][] array = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12} };
1
2
3
4
5
6
8
9
10
11
12
0 1 2 3 4
0
7
0 1 2 3 4
1 2 3 4
0 1 2 3 4 matrix[2][1] = 7;
matrix = new int[5][5];
array.length? 4
array[0].length? 3
matrix.length? 5
matrix[0].length? 5
96
Declaring, Creating, and Initializing Using Shorthand Notations You can also use an array initializer to declare,
create and initialize a two-dimensional array. For example,
int[][] array = new int[4][3];
array[0][0] = 1; array[0][1] = 2; array[0][2] = 3;
array[1][0] = 4; array[1][1] = 5; array[1][2] = 6;
array[2][0] = 7; array[2][1] = 8; array[2][2] = 9;
array[3][0] = 10; array[3][1] = 11; array[3][2] = 12;
int[][] array = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
{10, 11, 12}
};
Same as
97
Lengths of Two-dimensional Arraysint[][] x = new int[3][4];
x
x[0]
x[1]
x[2]
x[0][0] x[0][1] x[0][2] x[0][3] x[1][0] x[1][1] x[1][2] x[1][3] x[2][0] x[2][1] x[2][2] x[2][3]
x.length is 3
x[0].length is 4
x[1].length is 4
x[2].length is 4
98
int[][] array = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
{10, 11, 12}
};
array.length
array[0].length
array[1].length
array[2].length
array[3].length
If you use array[4].length, you get an error message: ArrayIndexOutOfBoundsException
99
Example: Grading Multiple-Choice Test (GradeExam.java) Objective: write a program that grades multiple-
choice test
A B A C C D E E A D D B A B C A E E A D E D D A C B E E A D C B A E D C E E A D A B D C C D E E A D B B E C C D E E A D B B A C C D E E A D E B E C C D E E A D
0 1 2 3 4 5 6 7 8 9
Student 0 Student 1 Student 2 Student 3 Student 4 Student 5 Student 6 Student 7
Students’ Answers to the Questions:
D B D C C D A E A D
0 1 2 3 4 5 6 7 8 9
Key
Key to the Questions:
100
Example: Computing Taxes Using Arrays (ComputeTax.java) Further improve “Computing Taxes with
Methods” using arrays Pervious example is re-written to use arrays to
store tax rates and brackets
101
6000 12000 6000 10000
27950 46700 23350 37450
67700 112850 56425 96745
141250 171950 85975 156600
307050 307050 153525 307050
10%
15%
27%
30%
35%
38.6%
Refine the table
102
6000 27950 67700 141250 307050
12000 46700 112850 171950 307050
6000 23350 56425 85975 153525
10000 37450 96745 156600 307050
Rotate
Single filer
Married jointly
Married separately
Head of household
6000 12000 6000 10000
27950 46700 23350 37450
67700 112850 56425 96745
141250 171950 85975 156600
307050 307050 153525 307050
Reorganize the table
103
int[][] brackets = {
{6000, 27950, 67700, 141250, 307050}, // Single filer
{12000, 46700, 112850, 171950, 307050}, // Married jointly
{6000, 23350, 56425, 85975, 153525}, // Married separately
{10000, 37450, 96700, 156600, 307050} // Head of household
};
10%
15%
27%
30%
35%
38.6%double[] rates = {0.10, 0.15, 0.27, 0.30, 0.35, 0.386};
6000 27950 67700 141250 307050
12000 46700 112850 171950 307050
6000 23350 56425 85975 153525
10000 37450 96745 156600 307050
Single filer
Married jointly
Married separately
Head of household
Declare Two Arrays