1
+ package com .udemy .dsapart1 .searching ;
2
+ import java .util .Arrays ;
3
+ import java .util .Scanner ;
4
+
5
+ /**
6
+ * NOTE : This search approach required sorted input array data sets.
7
+ *
8
+ */
9
+ public class BinarySearching {
10
+
11
+ public static void main (String [] args ) {
12
+ Scanner scInp =new Scanner (System .in );
13
+ System .out .print ("\n Enter the size of Array : " );
14
+ int sizeOfArr = scInp .nextInt ();
15
+ double [] inputArr = new double [sizeOfArr ];
16
+ System .out .println ("\n Enter the Array elements : " );
17
+ pushElementsIntoArray (inputArr );
18
+ System .out .println ("\n Input Array : " + Arrays .toString (inputArr ));
19
+ performMergeSort (inputArr );
20
+ System .out .println ("\n Required Merge Sorted array : " +Arrays .toString (inputArr ));
21
+ System .out .println ("\n **************** Performing Binary seaching ********************" );
22
+ System .out .print ("\n Enter the element to be searched : " );
23
+ double targetItem = scInp .nextDouble ();
24
+ int resultIndex =performBinarySearchingOnSortedArray (inputArr ,targetItem );
25
+ System .out .println ("\n Target element found at index : " +resultIndex );
26
+ System .out .println ("\n **************** Performing Recursive Binary seaching ********************" );
27
+ System .out .print ("\n Enter the element to be searched : " );
28
+ double target2Item = scInp .nextDouble ();
29
+ int result2Index =recursiveBinarySearching (inputArr ,targetItem ,0 ,inputArr .length -1 );
30
+ System .out .println ("\n Target element found at index : " +result2Index );
31
+ }
32
+
33
+
34
+ /**
35
+ * This algorithms time complexity - O(logN)
36
+ * @param inputArr - double[]
37
+ * @param targetItem - double
38
+ * @return resultIndex - int
39
+ *
40
+ */
41
+ private static int performBinarySearchingOnSortedArray (double [] inputArr , double targetItem ) {
42
+ int resultIndex =-1 ;
43
+ int startIndex =0 ;
44
+ int endIndex =inputArr .length -1 ;
45
+ int midIndex ;
46
+ while (startIndex <=endIndex ) {
47
+ midIndex =(startIndex +endIndex /2 );
48
+ if (inputArr [midIndex ]==targetItem ) {
49
+ return midIndex ;
50
+ }
51
+ if (inputArr [midIndex ]<targetItem ) {
52
+ return startIndex =midIndex +1 ;
53
+ }
54
+ else {
55
+ return endIndex =midIndex -1 ;
56
+ }
57
+ }
58
+ return resultIndex ;
59
+ }
60
+
61
+
62
+ /**
63
+ * This algorithms time complexity - O(logN)
64
+ * @param inputArr - double[]
65
+ * @param targetItem - double
66
+ * @return resultIndex - int
67
+ *
68
+ */
69
+ private static int recursiveBinarySearching (double [] inputArr , double targetItem ,int startIndex ,int endIndex ) {
70
+ int resultIndex =-1 ;
71
+ int midIndex ;
72
+ if (endIndex <startIndex )
73
+ {
74
+ return resultIndex ;
75
+ }
76
+ midIndex =(startIndex +endIndex /2 );
77
+ if (inputArr [midIndex ]==targetItem ) {
78
+ return midIndex ;
79
+ }
80
+ if (inputArr [midIndex ]<targetItem ) {
81
+ startIndex =midIndex +1 ;
82
+ return recursiveBinarySearching (inputArr ,targetItem ,startIndex ,endIndex );
83
+ }
84
+ else {
85
+ endIndex =midIndex -1 ;
86
+ return recursiveBinarySearching (inputArr ,targetItem ,startIndex ,endIndex );
87
+ }
88
+ }
89
+
90
+
91
+ /**
92
+ * Method to perform the Merge Sort algorithm using divide & Conquer approach.
93
+ *
94
+ * @param inputArr2
95
+ * Time complexity - n*log n.
96
+ *
97
+ */
98
+ private static void performMergeSort (double [] inputArr2 ) {
99
+ if (inputArr2 .length < 2 ) {
100
+ return ;
101
+ }
102
+ int midIndex = (inputArr2 .length / 2 );
103
+ double leftSubArray [] = new double [midIndex ];
104
+ double rightSubArray [] = new double [inputArr2 .length - midIndex ];
105
+ // fill the elements to left sub-array
106
+ for (int i = 0 ; i < midIndex ; i ++) {
107
+ leftSubArray [i ] = inputArr2 [i ];
108
+ }
109
+ // fill the elements to right sub-array
110
+ for (int i = midIndex ; i < inputArr2 .length ; i ++) {
111
+ rightSubArray [i -midIndex ] = inputArr2 [i ];
112
+ }
113
+ //recursive call on sorted left-sub array & right sub-array.
114
+ performMergeSort (leftSubArray );
115
+ performMergeSort (rightSubArray );
116
+ //Pass sorted sub-arrays
117
+ doSubArrayMergeOperation (leftSubArray ,rightSubArray ,inputArr2 );
118
+ }
119
+
120
+
121
+ /**
122
+ *
123
+ * This method will perform merge operation on input sorted sub-array
124
+ * @param leftSubArray
125
+ * @param rightSubArray
126
+ * @param inputArr2
127
+ *
128
+ */
129
+ private static void doSubArrayMergeOperation (double [] leftSubArray , double [] rightSubArray , double [] inputArr2 ) {
130
+ int i = 0 , j = 0 , k = 0 ;
131
+ while (i < leftSubArray .length && j < rightSubArray .length ) {
132
+ if (leftSubArray [i ] <= rightSubArray [j ]) {
133
+ inputArr2 [k ++] = leftSubArray [i ++];
134
+ }
135
+ else {
136
+ inputArr2 [k ++] = rightSubArray [j ++];
137
+ }
138
+ }
139
+ while (i < leftSubArray .length ) {
140
+ inputArr2 [k ++] = leftSubArray [i ++];
141
+ }
142
+ while (j < rightSubArray .length ) {
143
+ inputArr2 [k ++] = rightSubArray [j ++];
144
+ }
145
+ }
146
+
147
+
148
+ public static void pushElementsIntoArray (double inputArr []) {
149
+ Scanner scInp1Obj = new Scanner (System .in );
150
+ for (int i = 0 ; i < inputArr .length ; i ++) {
151
+ System .out .print ("\n Enter the element No " + (i + 1 ) + " : " );
152
+ inputArr [i ] = scInp1Obj .nextDouble ();
153
+ }
154
+ }
155
+
156
+ }
0 commit comments