코딩 테스트 준비 1(복잡도, 정렬)

넙데데맨·2023년 3월 25일

복잡도

알고리즘의 성능을 나타내는 척도

시간 복잡도

특정 크기 입력에 대해 알고리즘의 수행 시간 분석

공간 복잡도

특정 크기 입력에 대해 알고리즘의 메모리 사용량 분석

빅오 표기법 (Big-O Notation)

알고리즘의 성능을 표기하는 방법으로 가장 빠르게 증가하는 항을 고려하는 표기법
(x³)

https://mizohss.edu.in/big-o-notation-in-mizo/

정렬

병합 정렬(Merge Sort)

  1. 원소의 개수가 1 또는 0이 될때까지 두 부분으로 계속 쪼갠다.
  2. 쪼개진 원소들을 합치면서 정렬한다.
  • 연결 리스트로 구성 시 링크 인덱스만 변경 되기 때문에 데이터 이동이 적어진다.
public class Merge_Sort {


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 배열 입력 파트
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int idx = st.countTokens();
        int[] arr = new int[idx];

        for(int i=0; i<idx;i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }

        mergeSort(arr, 0, arr.length-1);

        for(int i=0; i<idx; i++){
            System.out.print(arr[i] + " ");
        }
    }

    // 분할
    public static void mergeSort(int[] arr, int left, int right){
        if (left < right) {
            int mid = (left + right) / 2;
            mergeSort(arr, left, mid);
            mergeSort(arr, mid + 1, right);

            merge(arr, left, mid, right);
        }
    }
    // 정렬하면서 합치기
    public static void merge(int[] arr, int left, int mid, int right){

        int[] temp = new int[arr.length];
        int i = left;
        int j = mid + 1;
        int k = left;
        System.out.println("[merge] " + left + " " + mid + " " + right);
        System.out.println("[merge] " + "i : " + i + " ,j : " + j + " ,k : " + k);
        // 좌분할의 첫 원소와 우분할의 첫 원소를 비교해서 둘 중 더 작은 원소를 temp에 넣는다.
        // 넣고 난 후 다음 원소와 큰 원소를 다시 비교한다.

        while (i <= mid && j <= right) {
            if (arr[i] <= arr[j]) {
                temp[k] = arr[i];
                i++;
            } else {
                temp[k] = arr[j];
                j++;
            }
            k++;
        }
        // 분할된 양쪽 배열 중 남은 배열의 원소들을 temp에 차례대로 넣는다.
        while (i <= mid) {
            temp[k] = arr[i];
            i++;
            k++;
        }

        while (j <= right) {
            temp[k] = arr[j];
            j++;
            k++;
        }
        // 정렬된 temp 배열을 arr로 옮긴다.
        for (int idx = left; idx <= right; idx++) {
            arr[idx] = temp[idx];
            System.out.print(arr[idx] + " ");
        }
        System.out.println();

    }

}

퀵 정렬(Quick Sort)

  1. 리스트의 한 요소를 PIVOT으로 정한다.
  2. PIVOT을 기준 작은값은 왼쪽 큰 값은 오른쪽으로 가게 정렬한다.
  3. 기준된 왼쪽 리스트와 오른쪽 리스트에 대해 같은 방식을 사용한다.
  4. 부분된 리스트의 길이가 0이나 1이 될 때까지 반복한다.

힙 정렬(Heap Sort)

완전 이진트리의 일종, 우선순위 큐를 위한 자료구조
완전 이진트리 : 왼쪽부터 순서대로 채워진 이진트리

힙 정렬은?

최소 힙트리 혹은 최대 힙트리를 구성한 후 하나씩 요소를 꺼내 배열에 저장하는 방식
최소 힙 트리 : 부모 노드가 자식 노드보다 작거나 같다.
최대 힙 트리 : 부모 노드가 자식 노드보다 크거나 같다

트리 정렬(Tree Sort)

이진 탐색 트리를 구성한 후 중위 순회 방법으로 순회하면서 정렬하는 방법

기수 정렬(Radix Sort)

낮은 자리부터 비교해서 정렬하는 방법

계수 정렬(Counting Sort)

해당 숫자 인덱스를 추가하는 방식으로 정렬하는 방법

Arrays.sort()
평균 O(NlogN) 최악 O(N^2)

Collections.sort()
평균 O(NlogN) 최악 O(NlogN)
메모리를 추가 사용함
삽입, 병합 정렬 사용

profile
차근차근

0개의 댓글