Added Jump Search algorithm and JUnit test
This commit is contained in:
parent
c0ca53743a
commit
6dcbaca774
84
src/main/java/com/search/JumpSearch.java
Normal file
84
src/main/java/com/search/JumpSearch.java
Normal file
@ -0,0 +1,84 @@
|
||||
package src.main.java.com.search;
|
||||
|
||||
public class JumpSearch {
|
||||
|
||||
/**
|
||||
* A jump search algorithm that finds the position of a key by moving over
|
||||
* fixed block ranges in a sorted array, and linear searches back on itself to
|
||||
* find it.
|
||||
*
|
||||
* Worst case time complexity: O(N^(1/2)) - square root n
|
||||
* Average case time complexity: O(N^(1/2)) - square root n
|
||||
* Worst case Space complexity: O(1)
|
||||
*
|
||||
* @param <T> This is any comparable type
|
||||
* @param arr This is the array where the element should be found
|
||||
* @param key This is the element to find in the array
|
||||
* @return The index of the key in the array
|
||||
*/
|
||||
public <T extends Comparable<T>> int findIndex(T arr[], T key) {
|
||||
return checkCondition(arr, key, arr.length);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param arrLength The array's length
|
||||
* @return The index position of the key in the array
|
||||
*/
|
||||
public <T extends Comparable<T>> int checkCondition(T arr[], T key, int arrLength) {
|
||||
int step = (int) Math.floor(Math.sqrt(arrLength)); // Find jump block
|
||||
int previous = 0; // Find block where element is / or not present
|
||||
|
||||
// Use ternary operator to find if step or array length is min value
|
||||
// and then minus the min value by one
|
||||
int minVal = (step < arrLength) ? step - 1 : arrLength - 1;
|
||||
|
||||
String arrayMinValIndexString = arr[minVal].toString();
|
||||
int arrayMinValIndexInt = Integer.parseInt(arrayMinValIndexString);
|
||||
String keyValueString = key.toString();
|
||||
int keyValueInt = Integer.parseInt(keyValueString);
|
||||
|
||||
// Increment next step and previous step in block to find range block
|
||||
while (arrayMinValIndexInt < keyValueInt) {
|
||||
previous = step;
|
||||
step += (int) Math.floor(Math.sqrt(arrLength));
|
||||
if (previous >= arrLength)
|
||||
return -1;
|
||||
minVal = (step < arrLength) ? step - 1 : arrLength - 1;
|
||||
arrayMinValIndexString = arr[minVal].toString();
|
||||
arrayMinValIndexInt = Integer.parseInt(arrayMinValIndexString);
|
||||
}
|
||||
// Get key position in linear search
|
||||
int position = linearSearchBlock(arr, key, step, previous, keyValueInt, arrLength, minVal);
|
||||
return position;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param step The next block index in the array
|
||||
* @param previous The previous block index in the array
|
||||
* @param keyValueInt The key in the format of an integer
|
||||
* @param minVal The minimum value of either next step or array length
|
||||
* @return The index position of the key in the array
|
||||
*/
|
||||
public <T extends Comparable<T>> int linearSearchBlock(T arr[], T key, int step, int previous, int keyValueInt,
|
||||
int arrLength, int minVal) {
|
||||
|
||||
// Linear search starting from previous block forwards.
|
||||
String arrayPositionString = arr[previous].toString();
|
||||
int arrayPositionValue = Integer.parseInt(arrayPositionString);
|
||||
while (arrayPositionValue < keyValueInt) {
|
||||
// If in next block or end of array length, key not in array
|
||||
if (previous == minVal)
|
||||
return -1;
|
||||
previous++;
|
||||
// Update arrayPositionValue in iteration
|
||||
minVal = (step < arrLength) ? step - 1 : arrLength - 1;
|
||||
arrayPositionString = arr[previous].toString();
|
||||
arrayPositionValue = Integer.parseInt(arrayPositionString);
|
||||
|
||||
}
|
||||
// If the key is found
|
||||
if (arrayPositionValue == keyValueInt)
|
||||
return previous;
|
||||
return -1;
|
||||
}
|
||||
}
|
29
src/test/java/com/search/JumpSearchTest.java
Normal file
29
src/test/java/com/search/JumpSearchTest.java
Normal file
@ -0,0 +1,29 @@
|
||||
package src.test.java.com.search;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.Assert;
|
||||
|
||||
import src.main.java.com.search.JumpSearch;
|
||||
|
||||
public class JumpSearchTest {
|
||||
|
||||
@Test
|
||||
public void testJumpSearch() {
|
||||
JumpSearch jumpSearch = new JumpSearch();
|
||||
|
||||
Integer arr[] = {11, 15, 16, 29, 36, 40, 42, 52};
|
||||
int x = 36;
|
||||
int index = jumpSearch.findIndex(arr, x);
|
||||
Assert.assertEquals("Incorrect index", 4, index);
|
||||
|
||||
Integer arrTwo[] = {-210, -190, -180, -160, -130, -120, -100};
|
||||
x = -120;
|
||||
index = jumpSearch.findIndex(arrTwo, x);
|
||||
Assert.assertEquals("Incorrect index", 5, index);
|
||||
|
||||
String arrString[] = {"101", "122", "136", "165", "225", "251","291"};
|
||||
String stringX = "122";
|
||||
index = jumpSearch.findIndex(arrString, stringX);
|
||||
Assert.assertEquals("Incorrect index", 1, index);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user