1
+ package src .main .java .com .search ;
2
+
3
+ public class JumpSearch {
4
+
5
+ /**
6
+ * A jump search algorithm that finds the position of a key by moving over
7
+ * fixed block ranges in a sorted array, and linear searches back on itself to
8
+ * find it.
9
+ *
10
+ * Worst case time complexity: O(N^(1/2)) - square root n
11
+ * Average case time complexity: O(N^(1/2)) - square root n
12
+ * Worst case Space complexity: O(1)
13
+ *
14
+ * @param <T> This is any comparable type
15
+ * @param arr This is the array where the element should be found
16
+ * @param key This is the element to find in the array
17
+ * @return The index of the key in the array
18
+ */
19
+ public <T extends Comparable <T >> int findIndex (T arr [], T key ) {
20
+ return checkCondition (arr , key , arr .length );
21
+ }
22
+
23
+ /**
24
+ * @param arrLength The array's length
25
+ * @return The index position of the key in the array
26
+ */
27
+ public <T extends Comparable <T >> int checkCondition (T arr [], T key , int arrLength ) {
28
+ int step = (int ) Math .floor (Math .sqrt (arrLength )); // Find jump block
29
+ int previous = 0 ; // Find block where element is / or not present
30
+
31
+ // Use ternary operator to find if step or array length is min value
32
+ // and then minus the min value by one
33
+ int minVal = (step < arrLength ) ? step - 1 : arrLength - 1 ;
34
+
35
+ String arrayMinValIndexString = arr [minVal ].toString ();
36
+ int arrayMinValIndexInt = Integer .parseInt (arrayMinValIndexString );
37
+ String keyValueString = key .toString ();
38
+ int keyValueInt = Integer .parseInt (keyValueString );
39
+
40
+ // Increment next step and previous step in block to find range block
41
+ while (arrayMinValIndexInt < keyValueInt ) {
42
+ previous = step ;
43
+ step += (int ) Math .floor (Math .sqrt (arrLength ));
44
+ if (previous >= arrLength )
45
+ return -1 ;
46
+ minVal = (step < arrLength ) ? step - 1 : arrLength - 1 ;
47
+ arrayMinValIndexString = arr [minVal ].toString ();
48
+ arrayMinValIndexInt = Integer .parseInt (arrayMinValIndexString );
49
+ }
50
+ // Get key position in linear search
51
+ int position = linearSearchBlock (arr , key , step , previous , keyValueInt , arrLength , minVal );
52
+ return position ;
53
+ }
54
+
55
+ /**
56
+ * @param step The next block index in the array
57
+ * @param previous The previous block index in the array
58
+ * @param keyValueInt The key in the format of an integer
59
+ * @param minVal The minimum value of either next step or array length
60
+ * @return The index position of the key in the array
61
+ */
62
+ public <T extends Comparable <T >> int linearSearchBlock (T arr [], T key , int step , int previous , int keyValueInt ,
63
+ int arrLength , int minVal ) {
64
+
65
+ // Linear search starting from previous block forwards.
66
+ String arrayPositionString = arr [previous ].toString ();
67
+ int arrayPositionValue = Integer .parseInt (arrayPositionString );
68
+ while (arrayPositionValue < keyValueInt ) {
69
+ // If in next block or end of array length, key not in array
70
+ if (previous == minVal )
71
+ return -1 ;
72
+ previous ++;
73
+ // Update arrayPositionValue in iteration
74
+ minVal = (step < arrLength ) ? step - 1 : arrLength - 1 ;
75
+ arrayPositionString = arr [previous ].toString ();
76
+ arrayPositionValue = Integer .parseInt (arrayPositionString );
77
+
78
+ }
79
+ // If the key is found
80
+ if (arrayPositionValue == keyValueInt )
81
+ return previous ;
82
+ return -1 ;
83
+ }
84
+ }
0 commit comments