-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDividenConquer.java
More file actions
129 lines (113 loc) · 3.34 KB
/
Copy pathDividenConquer.java
File metadata and controls
129 lines (113 loc) · 3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
public class DividenConquer {
public static void printArr(int arr[]) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void mergerSort(int arr[], int si, int ei) {
if (si >= ei) {
return;
}
// kaam
int mid = si + (ei - si) / 2; // mid part
mergerSort(arr, si, mid); // left part
mergerSort(arr, mid + 1, ei); // right part
merge(arr, si, mid, ei);
}
public static void merge(int arr[], int si, int mid, int ei) {
// left(0,1)->4 right=(4,6)->3 -----> 6-0+1=7
int temp[] = new int[ei - si + 1];
int i = si;// iterator for left part
int j = mid + 1;// iterator for right part
int k = 0;// iterator for temp arr
while (i <= mid && j <= ei) {
if (arr[i] < arr[j]) {
temp[k] = arr[i];
i++;
} else {
temp[k] = arr[j];
j++;
}
k++;
}
// left part
while (i <= mid) {
temp[k++] = arr[i++];
}
// right part
while (j <= ei) {
temp[k++] = arr[j++];
}
// copy temp to original arr
for (k = 0, i = si; k < temp.length; k++, i++) {
arr[i] = temp[k];
}
}
public static void quickSort(int arr[], int si, int ei) {
if (si >= ei) {
return;
}
// last element
int pIdx = partition(arr, si, ei);
quickSort(arr, si, pIdx - 1);
quickSort(arr, pIdx + 1, ei);
}
public static int partition(int arr[], int si, int ei) {
int pivot = arr[ei];
int i = si - 1;// to make place for els smaller than pivot
for (int j = si; j < ei; j++) {
if (arr[j] <= pivot) {
i++;
// swap
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
i++;
// swap
int temp = pivot;
arr[ei] = arr[i];
arr[i] = temp;
return i;
}
public static int search(int arr[], int target, int si, int ei) {
if (si > ei) {
return -1;
}
// kaam
int mid = si + (ei - si) / 2;
// case FOUND
if (arr[mid] == target) {
return mid;
}
// mid on L1
if (arr[si] <= arr[mid]) {
// case a: left
if (arr[si] <= target && target <= arr[mid]) {
return search(arr, target, si, mid - 1);
} else {
// case b: right
return search(arr, target, mid + 1, ei);
}
}
// mid on L2
else {
// case c: right
if (arr[mid] <= target && target <= arr[ei]) {
return search(arr, target, mid + 1, ei);
} else {
// case d: left
return search(arr, target, si, mid - 1);
}
}
}
public static void main(String args[]) {
int arr[] = { 9, 6, 3, 5, 2, 8 };
// mergerSort(arr, 0, arr.length - 1);
// quickSort(arr, 0, arr.length - 1);
// printArr(arr);
System.out.println(search(arr, 3, 0, arr.length - 1));
}
}