Accessing consecutive pairs of elements is part of a collection of standard algorithms.
Check if a list is sorted
This demonstration checks if an array is sorted in ascending order (smallest to largest) and allows duplicates. An empty array is considered sorted.
Determining if an array is sorted can be accomplished by checking each pair of adjacent elements (elements at consecutive indexes). If any pair is found to be out of order, the array is not sorted. If there is no pair that is out of order, the array is sorted.
Algorithm
Loop through every element except the first.
If the element before the current element is greater than the current element
Return false.
Return true.
Implementation in Java
public static boolean isSorted(int[] nums)
{
for(int i = 1; i < nums.length; i++)
{
if(nums[i - 1] > nums[i])
return false;
}
return true;
}
When skipping one or more elements, my preference is to start the loop later rather than end it earlier. This avoids the somewhat odd condition i < nums.length - 1
in the alternate solution below.
Alternate algorithm
Loop through every element except the last.
If the current element is greater than the one after it
Return false.
Return true.
Alternate implementation in Java
public static boolean isSorted(int[] nums)
{
for(int i = 0; i < nums.length - 1; i++)
{
if(nums[i] > nums[i + 1])
return false;
}
return true;
}
Some programmers prefer to skip the last value instead of the first. In this case, the values at indexes i
and i + 1
are checked.
Get the sums of all adjacent elements
Given an array of even length, return an array containing the sums of each pair of adjacent elements. Each element is part of exactly 1 pair. For example:
int[] sums = getSums(new int[] {1, 2, 3, 4, 5, 6});
results in sums
having the values:
[3, 7, 11]
3
is 1
+ 2
.
7
is 3
+ 4
.
11
is 5
+ 6
.
Algorithm
Create an array, sums, with length nums.length / 2
Loop through each pair of elements in nums (increment by 2).
Set sums[i / 2] to the sum of the current pair.
Return sums.
Implementation in Java
// precondition: nums.length % 2 == 0
public static int[] getSums(int[] nums)
{
int[] sums = new int[nums.length / 2];
for(int i = 0; i < nums.length; i += 2)
{
sums[i / 2] = nums[i] + nums[i + 1];
}
return sums;
}
This example defines pairs of consecutive elements differently than the example that checks if a list is sorted. In this example, each element is part of exactly 1 pair. The pairs are at indexes 0
and 1
, 2
and 3
, 4
and 5
, and so on.
When checking if a list is sorted, most elements are part of 2 pairs. The pairs are at indexes 0
and 1
, 1
and 2
, 2
and 3
, and so on.
The index in sums
is calculated as i / 2
, where i
is the index of the first element in each pair in nums
.
i |
i / 2 |
---|---|
0 |
0 |
2 |
1 |
4 |
2 |
6 |
3 |
It is also possible to maintain a separate index in sums
as shown below.
Alternate implementation using sumsIndex
// precondition: nums.length % 2 == 0
public static int[] getSums(int[] nums)
{
int[] sums = new int[nums.length / 2];
int sumsIndex = 0;
for(int numsIndex = 0; numsIndex < nums.length; numsIndex += 2)
{
sums[sumsIndex] = nums[numsIndex] + nums[numsIndex + 1];
sumsIndex++;
}
return sums;
}
This implementation maintains sumsIndex
separately instead of calculating it based on i
. i
has been renamed numsIndex
for readability.
Additional examples & practice
Detecting duplicates within an array known to be sorted can be accomplished by comparing each pair of adjacent elements. (A different approach is required for detecting duplicates in an array not known to be sorted.)
The CodingBat Array-2 exercises isEverywhere and either24 require accessing adjacent elements.
Help & comments
Get help from AP CS Tutor Brandon Horn