ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [정렬] 삽입정렬
    알고리즘 2024. 11. 10. 15:41

    정렬

    정렬 알고리즘 정의 시간복잡도
    삽입 대상을 선택해 정렬된 영역에서 선택 데이터의 적절한 위치를 찾아 삽입하면서 정렬하는 방식 O(N) ~ O(N^2)
    버블 데이터의 인접 요소끼리 비교하고, swap 연산을 수행하며 정렬하는 방식 O(N^2)
    선택 대상에서 가장 크거나 작은 데이터를 찾아가 선택을 반복하면서 정렬하는 방식 O(N^2)
    pivot 값을 선정해 해당 값을 기준으로 정렬하는 방식 O(NlogN) ~ O(N^2)
    이진트리를 이용하여 최대힙(오름차순)/최소힙(내림차순) 트리를 구성해
    정렬하는 방식
    O(NlogN)
    병합 이미 정렬된 부분 집합들을 효율적으로 병합해 전체를 정렬하는 방식 O(NlogN) + 추가적인 메모리 필요
    기수 데이터의 자릿수를 바탕으로 비교해 데이터를 정렬하는 방식 O(N) + 추가적인 메모리 필요

     

    삽입정렬

    삽입정렬은 이미 정렬된 데이터 범위에 정렬되지 않은 데이터를 적절히 삽입시키는 정렬방법
    시간복잡도는 O(N^2)으로 느린편에 속한다.
    • 빨강 : 정렬된 범위
    • 파랑 : 정렬되지 않은 범위
    순서 과정
    첫번째 (42 삽입) 42 32 24 60
    두번째 (32 삽입) 32 42 24 60
    세번째 (24 삽입) 24 32 42 60

     

    삽입정렬 과정

    1. 현재 index에 있는 데이터 값을 선택한다
    2. 현재 선택한 데이터가 정렬된 데이터 범위에 삽입될 위치를 탐색한다
    3. 삽입 위치부터 index에 있는 위치까지 shift 연산을 수행한다
    4. 삽입 위치에 현재 선택한 데이터를 삽입하고 index++ 연산을 수행한다
    5. 전체 데이터의 크기만큼 Index가 커질때까지, 즉 선택할 데이터가 없을때까지 반복한다

     

    삽입정렬 구현

    • shift()연산을 구현 ( 삽입 위치 ~ 정렬된 끝 범위 : shit연산 진행 )
    public class App {
        public static void main(String[] args) throws Exception {
            int []arr = {42,32,24,60};
            for(int i =1; i<arr.length; i++){
                int choiceNum = arr[i];
                int insertIndex = i;
                for(int j = i-1; j >= 0; j--){
                    if ( arr[j] > choiceNum ){
                        insertIndex = j;
                    }else{
                        break;
                    }
                }
    
                shift(arr,insertIndex, i);
            }
            
            for ( int i : arr) {
                System.out.println(i);
            }
    
        }
    
        private static void shift(int[] arr,int insertIndex, int endIndex){
            int temp = arr[endIndex]; // 삽입할값 저장
    
            /**
             * Ex) 32, 42, 24
             * 값 저장: temp = 24
             * - 32, 42, 42
             * - 32, 32, 42 // 반복문 종료
             */
            for (int i =endIndex; i > insertIndex; i--){
                arr[i] = arr[i-1];
            }
            
            // 24, 32, 42
            arr[insertIndex] = temp;
        }
    }

    '알고리즘' 카테고리의 다른 글

    [정렬] 병합정렬  (0) 2024.11.12
    [정렬] 퀵 정렬  (0) 2024.11.11
    [정렬] 선택정렬  (0) 2024.11.09
    [정렬] 버블정렬  (0) 2024.11.07
    우선순위 큐  (0) 2024.11.06
Designed by Tistory.