관리 메뉴

사과하는 제라스

기본 정렬 - Insertion sort(삽입 정렬) 본문

알고리즘 학습 페이지

기본 정렬 - Insertion sort(삽입 정렬)

Xerath(제라스) 2021. 11. 21. 19:49

목차

    728x90
    반응형

    [정렬 방법]


    전체(n개의 값)에서 arr[1], arr[2], ..., arr[n-1] 순으로 기준값(key)으로 두고 바로 왼쪽 값부터 왼쪽에 있는 값들이 key보다 클 경우 한칸씩 오른쪽으로 옮긴다. 작을 경우엔 멈추고 비교대상이던 값의 오른쪽에 key값을 넣어준다. 이 과정을 arr[n-1]까지 진행하면 정렬된다.


    [정렬 과정]

     

    n 크기의 임의의 배열 arr에서

    <1단계> - 1번의 비교

     

    arr[1] 값을 key값으로 둔 후,

     

    arr[0]와 비교해서 key값이 작으면 arr[1] = arr[0], arr[0] = key, key값이 크면 arr[1] = key

     

    <2단계> - 최대 2번의 비교

     

    arr[2] 값을 key값으로 둔 후,

     

    arr[1]와 비교해서 key값이 작으면 arr[2] = arr[1]로 한 후 (1), key값이 크면 arr[2] = key

    (1) arr[0]과 비교하여 key값이 작으면 arr[1] = arr[0], arr[0] = key, key값이 크면 arr[1] = key

    .

    .

    .

     

    <n-1단계> - 최대 n-1번의 비교

     

    arr[n-1] 값을 key값으로 둔 후,

     

    arr[n-2]와 비교해서 key값이 작으면 arr[n-1] = arr[n-2]로 한 후 (1), key값이 크면 arr[n-1] = key

    (1) arr[n-3]과 비교하여 key값이 작으면 arr[n-2] = arr[n-3]로 한 후 (2), key값이 크면 arr[n-2] = key

    (2) arr[n-4]과 비교하여 key값이 작으면 arr[n-3] = arr[n-4]로 한 후 (3), key값이 크면 arr[n-3] = key

    ...

    (n-2) arr[0]과 비교하여 key값이 작으면 arr[1] = arr[0], arr[0] = key, key값이 크면 arr[1] = key


    [pseudo code]

    insertionSort(arr[], n) {
      for i <- 1 to n-1
        arr[0]-arr[i] 위치에서 맞는 곳에 arr[i]를 삽입
    }

    [코드 구현]

     

    public class Insertion {
      private static int[] input = {3, 54, 4, 12, 67, 31, 43, 56, 14, 53}; //예시로 작성한 배열
    
      public static void main(String[] args) {
        insertionSortMin(input, input.length); //혹은 insertionSortMax(input, input.length);
        for (int i : input) {
          System.out.print(i + " ");
        }
      }
    
      private static void insertionSortMin(int[] input, int length) { //가장 작은 값부터 삽입 정렬하는 방법
        int tmp;
        for(int i=1; i<length; i++){
          tmp = input[i];
            int j = i-1;
            while(0 <= j && input[j] > tmp){
                input[j+1] = input[j];
                j--;
            }
            input[j+1] = tmp;
        }
      }
      
      private static void insertionSortMax(int[] input, int length) { //가장 큰 값부터 삽입 정렬하는 방법
        int tmp;
        for(int i=length-2; i>=0; i--){ 
          tmp = input[i];
            int j = i+1;
            while(length-1 >= j && input[j] < tmp){
                input[j-1] = input[j];
                j++;
            }
            input[j-1] = tmp;
        }
      }
      
    }

    [시간 복잡도]

    정렬이 잘 되어 있는 정도에 따라서

    1) 최악의 경우

     

    처음에 1번의 비교, 그 다음에 2번의 비교,... n-1번의 비교를 진행하므로

    T(n) = ( 1+2+...+n-1 ) = O( n(n-1)/2 ) = O(n^2) 이 된다.

     

    2) 최선의 경우

    배열이 모두 정렬이 되어있는 경우로 처음부터 매 경우마다 비교 후 바로 끝나기 때문에 시간 복잡도는 O(n)이다.

     

    3) 평균

    Selection sort(선택 정렬)와 Bubble sort(버블 정렬)과 비교 시 최악의 경우는 같지만  최선의 경우엔 상대적으로 빠르다. 그러므로 평균은 절반 정도이다. 하지만 시간 복잡도는 O(n^2)이라 한다.

    728x90
    반응형