2 분 소요

1) 버블정렬

: 인접한 두 값을 비교하여 큰(작은) 값을 뒤(앞)로 보내는 작업을 반복

public static void bubbleSort(int[] arr) {
    for (int i = 1; i < arr.length - 1; i++) {
        for (int j = 0; j < arr.length - i; j++) {
            if(arr[j] > arr[j+1]) {
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}

2) 삽입정렬

: 앞(뒤)과 비교하면서 자신보다 작은(큰) 수가 나올때까지 이동하는 것을 반복

public static void insertionSort(int[] arr) {
    for (int i = 1; i < arr.length; i++) {
        for (int j = i; j > 0 ; j--) {
            if(arr[j] < arr[j-1]) {
                while(arr[j]<arr[j-1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j-1];
                    arr[j-1] = tmp;
                }
            }
        }
    }
}

3) 선택정렬

: 가장 작은(큰) 수를 배열 맨 앞(뒤)로 보내는 작업을 반복

public static void selectionSort(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        int min = i;
        for (int j = i; j < arr.length; j++) {
            if (arr[j] < arr[min]) {
                min = j;
            }
        }
        int tmp = arr[i];
        arr[i] = arr[min];
        arr[min] = tmp;
    }
}

4) 퀵정렬

: 기준값(피봇)을 가운데로 설정한 후 피봇보다 작은 값은 왼쪽으로, 큰 값은 오른쪽으로 이동하는 것을 반복
양쪽 포인터가 피봇 인덱스에 모이게 되면 종료
나누어진 파티션 안에서 퀵정렬 재귀호출 반복

// 퀵정렬 재귀호출 시작
public static void quickSort(int[] arr) {
    quickSort(arr, 0, arr.length - 1);
}

// 퀵정렬할 배열과 시작점, 끝점 매개변수
public static void quickSort(int[] arr, int start, int end) {
    // 뒤쪽 파티션의 시작점을 받아옴
    int part2Start = partition(arr, start, end);
    // 각 파티션에 배열원소가 1개뿐인 경우 더이상 정렬할 필요가 없음
    // 왼쪽 파티션에 배열원소가 1개 이상 있을 경우
    if(start < part2Start - 1) {
        quickSort(arr, start, part2Start - 1); // 퀵정렬 재귀호출
    }
    // 오른쪽 파티션에 배열원소가 1개 이상 있을 경우
    if(part2Start < end) {
        quickSort(arr, part2Start, end); // 퀵정렬 재귀호출
    }
}

// 파티션 나누는 메서드
public static int partition(int[] arr, int start, int end) {
    // 기준값은 배열의 가운데 위치한 값
    int pivot = arr[(start + end) / 2];
    // 왼쪽에서 시작하는 인덱스가 오른쪽에서 시작하는 인덱스보다 작은 동안 반복
    while(start <= end) {
        while(arr[start] < pivot) { start++; } // 기준값보다 작으면 인덱스 이동
        while(arr[end] > pivot) { end--; } // 기준값보다 크면 인덱스 이동
        // 둘 다 멈춘 곳은 기준값보다 왼쪽-큰 값, 오른쪽-작은 값
        // 왼쪽 인덱스가 오른쪽 인덱스보다 작거나 같으면
        if(start <= end) {
            swap(arr, start, end); // 스왑
            start++; // 인덱스 하나씩 이동
            end--;
        }
    }
    // 기준값 인덱스를 리턴하며, 이 값은 다음 파티션때 뒷 배열의 첫 인덱스가 됨.
    return start;
}

// 자리 바꿔주는 메서드
public static void swap(int[] arr, int start, int end) {
    int tmp = arr[start];
    arr[start] = arr[end];
    arr[end] = tmp;
}

마지막 수정일시: 2022-06-20 06:22

댓글남기기