public class cz_거듭제곱_분할정복 {
public static void main(String[] args) {
int C = 2;
int N = 10;
}
public static int pow(int C, int N) {
// 기저조건 (단, 0부터 시작하지 않는다는 조건에 한해서)
if(N == 1) return C;
// 재귀부분
// 1. 짝수인 경우
if (N%2 == 0) {
return pow(C, N/2) * pow(C, N/2);
}
// 2. 홀수인 경우
else {
return pow(C, (N-1)/2) * pow(C, (N-1)/2);
}
}
// 상위 메소드는 pow를 반복해야 하므로, 동일한 값이기에 int에 저장하여 사용
public static int pow2(int C, int N) {
if(N == 1) return C;
// 재귀부분
// 1. 짝수인 경우
if (N%2 == 0) {
int tmp = pow2(C, N/2);
return tmp * tmp;
}
// 2. 홀수인 경우
else {
int tmp = pow2(C, (N-1)/2);
return tmp * tmp * C;
}
}
}
public class cz_이진검색2 {
static int[] arr = { 8, 9, 17, 21, 23, 35, 88, 369 };
static int key;
public static void main(String[] args) {
// 우선 배열이 정렬되지 않았다면, 정렬 후 진행해야 한다.
key = 35;
System.out.println(binarySearch(0, arr.length-1));
// Arrays.binarySearch 라는 메소드가 이미 지정되어 있다. 배열과 key 값을 입력하면 반환해준다.
}
static boolean binarySearch(int left, int right) {
// 기저 조건
// 잘못 입력이 되거나 교차가 될 때 false로 출력
if (left > right) return false;
// 재귀 부분
int mid = (left+right)/2;
// 1 같은 경우
if (arr[mid] == key) return true;
// 2 작은 경우, 왼쪽 구간으로 탐색
else if (arr[mid] > key) return binarySearch(left, mid-1);
// 3 큰 경우, 오른쪽 구간으로 탐색
else return binarySearch(mid+1, right);
}
}
import java.util.Arrays;
public class cz_병합정렬 {
static int[] arr = {7, 5, 13, 2, 79, 12, 35, 42};
static int N = arr.length; // 배열의 길이
static int[] tmp = new int[N];
public static void main(String[] args) {
mergeSort(0, N-1);
System.out.println(Arrays.toString(arr));
}
// 구간을 쪼개는 로직
static void mergeSort(int left, int right) {
// left : 구간의 시작 위치 / right : 구간의 끝 위치
if (left < right) { // 아직 할 게 남아있다.
int mid = (left+right) / 2;
mergeSort(left, mid);
mergeSort(mid + 1, right);
merge(left, mid, right);
}
}
// 시작, 중앙(왼쪽 끝), 끝 부분에 대한 설명
static void merge(int left, int mid, int right) {
int L = left;
int R = mid + 1;
int idx = left; // tmp(비어있는) 배열의 인덱스
while (L <= mid && R <= right) { // 아직 왼쪽과 오른쪽 구간이 끝에 닿지 않았을 경우에
if(arr[L] <= arr[R]) {
tmp[idx++] = arr[L++];
} else {
tmp[idx++] = arr[R++];
}
}
// 왼쪽 구간의 값이 남은 경우
if(L <= mid) {
for(int i = L; i <= mid; L++) tmp[idx++] = arr[i];
}
// 오른쪽 구간의 값이 남은 경우
else {
for(int i = R; i <= right; L++) tmp[idx++] = arr[i];
}
// 원본 배열에 반영
for(int i = left; i <= right; i++) {
arr[i] = tmp[i];
}
}
}
Hoare 파티션
static void quickSort(int left, int right) {
if (left < right) {
int pivot = partition(left, right);
quickSort(left, pivot - 1);
quickSort(pivot + 1, right);
}
}
// 반환값은 피봇의 위치
private static int partition(int left, int right) {
int pivot = arr[left];
int L = left + 1, R = right;
while (L <= R) {
// L : pivot 보다 큰 값을 찾을 때까지 이동을 하겠다.
while (L <= R && arr[L] <= pivot)
L++;
// R : pivot 보다 작거나 같은 갑을 만날 때까지 이동을 하겠다.
while (arr[R] > pivot)
R--;
if (L < R) {
int tmp = arr[L];
arr[L] = arr[R];
arr[R] = tmp;
}
}
// R의 위치는 사실 피봇이 가야할 위치이다.
int tmp = arr[left];
arr[left] = arr[R];
arr[R] = tmp;
return R; // 피봇의 위치
}
Lomuto 파티션
import java.util.Arrays;
public class cz_퀵정렬 {
static int[] arr = {7, 5, 13, 2, 79, 12, 35, 42};
static int N = arr.length; // 배열의 길이
public static void main(String[] args) {
pSort(0, N-1);
System.out.println(Arrays.toString(arr));
}
static void pSort(int left, int right) {
if (left < right) {
int pivot = partirion(left, right);
pSort(left, pivot-1);
pSort(pivot+1, right);
}
}
static int partirion(int left, int right) {
int pivot = arr[right];
int i = left - 1; // 작은 값들의 경계
for(int j = left; j < right; j++) {
if(arr[j] <= pivot) {
i++;
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
int tmp = arr[i+1];
arr[i+1] = arr[right];
arr[right] = tmp;
return i+1;
}
}